J'ai une fonction qui retourne un Bool Observable selon que cela a été correct ou non.
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>
Renvoie une séquence observable contenant un seul élément. Au lieu de cela, vous devriez utiliser quelque chose comme ça:
create<E>(subscribe: (AnyObserver<E>) -> Disposable) -> Observable<E>
Créer une méthode crée une séquence observable à partir d'une implémentation de méthode d'abonnement spécifiée.
Dans ton cas:
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 est l'action appelée au cas où vous souhaiteriez être interrompu. Supposons que vous laissiez votre contrôleur de vue ou que l'application doive être utilisée avec le service et que vous n'ayez plus besoin d'appeler cette demande. C’est génial pour les téléchargements de vidéos ou quelque chose de beaucoup plus gros. Vous pouvez faire request.cancel (), qui nettoie toutes les ressources lorsque vous avez terminé. Ceci est appelé en cas d’achèvement ou d’erreur.
Pour créer des observables, il existe une fonction create
. Vous pouvez l'utiliser comme ceci:
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
})
}
Utilisez un résultat enum comme valeur observable.
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))
}