使用 RxSwift 同步异步网络调用

Posted

技术标签:

【中文标题】使用 RxSwift 同步异步网络调用【英文标题】:synchronize async network calls with 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)

【问题讨论】:

【参考方案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)

【讨论】:

谢谢,正是我想要的答案。

以上是关于使用 RxSwift 同步异步网络调用的主要内容,如果未能解决你的问题,请参考以下文章

调用fastdfsapi是同步的还是异步的

同步异步阻塞非阻塞四种调用方式

同步异步阻塞非阻塞 总结

同步阻塞同步非阻塞异步阻塞异步非阻塞

名词解释:同步、异步、阻塞和非阻塞

同步与异步 & 阻塞与非阻塞