使用 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) 中崩溃的主要内容,如果未能解决你的问题,请参考以下文章
使用 RxMoya 在 RxSwift 上未获得 Completed 事件
如何正确过滤 RxMoya 中的SuccessfulStatusCodes