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?
}
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()を実行できます。これは、完了時またはエラー時に呼び出されます。
オブザーバブルを作成するための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
})
}
結果の列挙を観察可能な値として使用します。
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))
}