web-dev-qa-db-fra.com

RxSwift: retourne une nouvelle observable avec une erreur

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?
}
8
Godfather
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.

8
Alexander Guschin

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


   })
}
2
Serg Dort

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))
}
0