【问题标题】:synchronize async network calls with RxSwift使用 RxSwift 同步异步网络调用
【发布时间】:2017-07-31 06:15:28
【问题描述】:

我正在使用 Facebook 对用户进行身份验证。这个过程是异步发生的。完成后,我必须通过 firebase 对用户进行身份验证,这会发生异步。即使我使用的是 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)

【问题讨论】:

    标签: ios swift asynchronous rx-swift


    【解决方案1】:

    尝试使用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)
    

    【讨论】:

    • 谢谢,正是我想要的答案。
    猜你喜欢
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    相关资源
    最近更新 更多