2017-07-31 15 views
0

私はFacebookを使用してユーザーを認証しています。このプロセスは非同期で行われます。これが完了した後、私はfirebaseを通じてユーザーを認証する必要があります。これは非同期で行われます。私はRxSwiftを使用していますが、コールバックを使用してコールバック地獄で終わるように、非同期タスクをネストすることになります。RxSwiftとの非同期ネットワークコールの同期

私の現在の手順はちょうど正しいとは思われません。読みにくい。それは私ですか、複数の非同期ネットワークコールを処理するより洗練されたアプローチです。

この例では、コードをさらに読みにくくするため、エラーイベントを取り出しました。

ヒントやガイダンスをお寄せいただきありがとうございます。

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) 

答えて

0

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) 

エラーを処理するには、mapfilterを使用することができ、例えば:

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

は、私が探していただけの答えをいただき、ありがとうございます。 –

+0

@AnonProgrammerあなたは大歓迎です:) – alaphao

関連する問題