2017-06-10 5 views
0

atteignant Je suis un débutant à RxSwift et je suis en train de mettre en œuvre connexion fonctionnalité facebook, et voici ce que je fais:Bouton avec abonnement rx.tap terminé

loginButton.rx.tap 
      .debug("login tapped") 
      .flatMap { [weak self]()->Observable<AccessToken> in 
       guard let strongSelf = self else { 
        throw NetworkError.requestCancelled 
       } 
       return strongSelf.viewModel.loginFacebook(from: strongSelf) 
      } 
      .flatMap { [weak self] accessToken->Observable<(accessToken: String, userId: String)> in 
       guard let strongSelf = self else { 
        throw NetworkError.requestCancelled 
       } 
       return strongSelf.viewModel.requestUserInfo(token: accessToken) 
      } 
      .flatMap { [weak self] (accessToken: String, userId: String)->Observable<LoginResult> in 
       guard let strongSelf = self else { 
        throw NetworkError.requestCancelled 
       } 
       return strongSelf.viewModel.authenticate(accessToken: accessToken, userId: userId) 
      } 
      .catchError({ error -> Observable<LoginResult> in 
       return Observable.just(LoginResult.failure(error: error as! NetworkError)) 
      }) 
      .subscribe (onNext:{ [weak self] result in 
       guard let strongSelf = self else { 
        return 
       } 

       switch result { 
       case .success: 
        // do something with success 
        } 
       case .failure(let error): 
        // do something with error 
       } 
      }, onCompleted: { 
       print("rx.tap completed") 
      }) 
      .disposed(by: disposeBag) 

La chose est quand je tape bouton de connexion puis fermez la fenêtre de connexion de Facebook qui apparaît, mon abonnement à rx.tap atteint onCompleted, alors quand j'essaie d'appuyer à nouveau sur le bouton, rien ne se passe. Comment dois-je gérer ce cas? Toute suggestion pourrait aider.

Répondre

0

C'est un schéma simplifié de votre chaîne:

loginButton.rx.tap 
    .flatMap({ (_) -> Observable<Void> in 
     throw NSError(domain: "", code: 0, userInfo: [:]) 
    }) 
    .catchError({ error -> Observable<Void> in 
     return Observable<Void>.just() 
    }) 
    .subscribe() 

Lorsque vous produisez Observable<Void>.just() dans catchError bloc ou quelque chose de similaire dans d'autres blocs, il ne se déclenche une fois et qui est la raison pour laquelle vous recevez completed et rien ne se passe plus tard. Je conseille de mettre tout le code que vous avez dans flatMapLatest par exemple. Le code résultat sera:

loginButton.rx.tap 
    .flatMapLatest({ _ -> Observable<Void> in 
     return Observable<Void> 
      .just() 
      .flatMap({ (_) -> Observable<Void> in 
       throw NSError(domain: "", code: 0, userInfo: [:]) 
      }) 
      .catchError({ error -> Observable<Void> in 
       return Observable<Void>.just() 
      }) 
    }) 
    .subscribe() 

Hope it helps

post-scriptum Vérifiez le similar answer du membre de l'équipe de développement RxSwift