2017-07-31 10 views
0

J'utilise Facebook pour authentifier les utilisateurs. Ce processus se produit async. Après cela, je dois authentifier l'utilisateur via Firebase, ce qui arrive async. Même si j'utilise RxSwift, je finis par imbriquer des tâches asynchrones comme si je devais utiliser les callbacks et finir avec le rappel.synchroniser les appels réseau asynchrones avec RxSwift

Ma procédure actuelle ne me semble pas correcte. Un peu difficile à lire aussi. Est-ce moi ou est-il une approche plus élégante pour gérer plusieurs appels réseau asynchrones. Pour cet exemple, j'ai supprimé les événements d'erreur car cela rend le code encore moins lisible.

Merci pour des conseils ou des conseils.

func rx_login(viewController: UIViewController) { 

    /// Facebook login 
    rx_facebookLogin(viewController: viewController) 
     .asObservable() 
     .subscribe(onNext: { [weak self] (credentials: AuthCredential, userInfo: [String: Any]) in 

      /// Firebase Login 
      rx_firebaseLogin(with: credentials) 
       .asObservable() 
       .subscribe(onNext: { [weak self] (uid) in 

        /// TODO: Save user info firebase db 


       }).addDisposableTo(disposeBag) 

     }).addDisposableTo(disposeBag) 

Répondre

0

Essayez d'utiliser flatMapLatest:

/// Facebook login 
rx_facebookLogin(viewController: viewController) 
    .flatMapLatest { credentials, _ in rx_firebaseLogin(with: credentials) } 
    .subscribe(onNext: { [weak self] (uid) in 
     /// TODO: Save user info firebase db 
    }) 
    .addDisposableTo(disposeBag) 

Pour gérer les erreurs, vous pouvez utiliser map et filter, par exemple .:

let facebookLogin = rx_facebookLogin(viewController: viewController) 
    .map { credentials, userInfo -> (AuthCredential, String?) in 
     let error = userInfo["error"] as? String 
     return (credentials, error) 
    } 
    .shareReplayLatestWhileConnected() 

// Success 
facebookLogin 
    .filter { _, error in error == nil } 
    .flatMapLatest { credentials, _ in rx_firebaseLogin(with: credentials) } 
    .subscribe(onNext: { (uid) in 
     // Success! 
    }) 
    .addDisposableTo(disposeBag) 

// Fail 
facebookLogin 
    .filter { _, error in error != nil } 
    .subscribe(onNext: { _, error in 
     // Error! 
     print(error) 
    }) 
    .addDisposableTo(disposeBag) 
+0

Merci, juste la réponse que je cherchais. –

+0

@AnonProgrammer vous êtes les bienvenus :) – alaphao