使用 mvvm 模型的 RxMoya 请求总是在observer.onError(error) 中崩溃

Posted

技术标签:

【中文标题】使用 mvvm 模型的 RxMoya 请求总是在observer.onError(error) 中崩溃【英文标题】:RxMoya request using mvvm model always crashes in observer.onError(error) 【发布时间】:2017-11-06 18:59:21 【问题描述】:

以下是我的注册代码

self.signedUp  = signUpButtonTap.withLatestFrom(userAndPassword).flatMapLatest
            input ->  Observable<Response> in
            return  Observable.create  observer in
                let userData = Creator()
                userData?.username = input.0
                userData?.password = input.1
                provider.request(.signIn(userData!)).filter(statusCode: 200).subscribe  event -> Void in

                    switch event 
                    case .next(let response):
                        observer.onNext(response)

                    case .error(let error):
                        let moyaError: MoyaError? = error as? MoyaError
                        let response: Response? = moyaError?.response
                        let statusCode: Int? = response?.statusCode
                        observer.onError(error)

                    default:
                        break
                    

                
                return Disposables.create()
            
        

下面是View中的绑定

 self.viewModel.signedUp.bindresponse in
               self.displayPopUpForSuccessfulLogin()
            

当有一个成功的响应时,它工作正常。

但是当请求超时或我收到任何其他状态码而不是 200 时,我收到以下错误“fatalError(lastMessage)”并且应用程序崩溃。

当我在 case .error 中将observer.onError(error) 替换为observer.onNext(response) 时,它适用于200 以外的响应代码,但在请求超时时再次崩溃。

我已经通过这个链接Handling Network error in combination with binding to tableView (Moya, RxSwift, RxCocoa)

谁能帮我解决问题。我对 RxSwift 完全陌生。任何帮助将不胜感激。谢谢

【问题讨论】:

能否请您尝试返回您的subscribe 而不是Disposables.create()?只需在provider... 之前进行退货。它解决了你的问题吗? 否 进行更改后我仍然有同样的错误 您能否提供更多有关您遇到的错误的信息?也许您将错误绑定到 UI 或在不正确的线程上处理 UI 副作用? 我已经编辑了这个问题。当观察者返回错误时,它会崩溃。看起来我正在尝试将错误绑定到 UI。关于我应该如何处理这个问题的任何帮助? 【参考方案1】:

如果provider.request(.signIn(userData!)) // ... 在某个后台线程返回结果,结果将绑定到后台线程中的 UI 元素,这可能导致非确定性崩溃。

应该是

provider.request(.signIn(userData!))
            .observeOn(MainScheduler.instance) // ...

根据RxSwift github tips: Drive

【讨论】:

以上是关于使用 mvvm 模型的 RxMoya 请求总是在observer.onError(error) 中崩溃的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift 取消 RxMoya 网络请求

使用 RxMoya 在 RxSwift 上未获得 Completed 事件

如何正确过滤 RxMoya 中的SuccessfulStatusCodes

WPF 中的 MVVM - 如何提醒 ViewModel 模型中的变化......或者我应该吗?

谈MVVM

用户控件中的Mvvm light SimpleIoC