web-dev-qa-db-ja.com

RxSwift:エラーのある新しいオブザーバブルを返す

OKかどうかに応じてBool Observableを返す関数があります。

func test() -> Observable<Bool> {
   if everythingIsOk {
      return just(true)
   }
   return just(false) <- how can i here return a custom error to retrieve what failed?
}
13
Godfather
just<E>(element: E) -> Observable<E>

単一の要素を含む監視可能なシーケンスを返します。代わりに、次のようなものを使用する必要があります。

create<E>(subscribe: (AnyObserver<E>) -> Disposable) -> Observable<E>

Createメソッドは、指定されたサブスクライブメソッド実装から監視可能なシーケンスを作成します。

あなたの場合:

private let realm = try! Realm()

func save(customObject: CustomObject) -> Observable<Bool> {
    return create({ observer -> Disposable in
        do {
            try self.realm.write {
                self.realm.add(customObject, update: true)
                observer.onNext(true)
                observer.onCompleted()
            }
        } catch {
            // .Error sequence will be automatically completed
            observer.onError(NSError(domai...)
        }

        // if realm.write is sync task(by default it is, as I know) you can actually return NopDisposable
        return NopDisposable.instance
        // otherwise you should cancel write transaction in AnonymousDisposable
    })
}

AnonymousDisposableは、中断されたい場合に呼び出されるアクションです。 View Controllerを離れるか、アプリでサービスを完了する必要があり、このリクエストを呼び出す必要がなくなったとします。動画のアップロードなどに最適です。処理が完了すると、すべてのリソースをクリーンアップするrequest.cancel()を実行できます。これは、完了時またはエラー時に呼び出されます。

9

オブザーバブルを作成するためのcreate関数があります。次のように使用できます。

func test() -> Observable<Bool> {
   return create({ (observer) -> Disposable in
//      Some condition
      observer.onNext(true)
//      Some other condition
      observer.onNext(false)
//      Some other condition
      observer.onError(NSError(domain: "My domain", code: -1, userInfo: nil))
//      Some other condition
      observer.onCompleted()

      return AnonymousDisposable {
//         Dispose resources here
      }
//      If u have nothing to dipose use NopDisposable.instance


   })
}
4
Serg Dort

結果の列挙を観察可能な値として使用します。

public enum Result<Value> {
    case success(Value)
    case failure(Error)
}

func test() -> Observable<Result<Bool>> {
   if everythingIsOk {
      return just(.success(true))
   }

   let error = ...
   return just(.failure(error))
}