处理 UITableView 绑定中的连接错误(Moya、RxSwift、RxCocoa)
Posted
技术标签:
【中文标题】处理 UITableView 绑定中的连接错误(Moya、RxSwift、RxCocoa)【英文标题】:Handle Connection Error in UITableView Binding (Moya, RxSwift, RxCocoa) 【发布时间】:2018-11-18 13:01:44 【问题描述】:我正在使用 RxCoCoa 和 RxSwift 进行 UITableView Biding。 问题是当连接丢失或除服务器错误(我处理了它们)之外的其他连接错误时,我的应用程序由于下面提到的绑定错误而崩溃。我的问题是如何处理连接错误?
fileprivate func getNextState()
showFullPageState(State.LOADING)
viewModel.getProductListByID(orderGroup: OrderGroup.SERVICES.rawValue)
.do(onError:
showStatusError(error: $0)
self.showFullPageState(State.CONTENT)
)
.filter
$0.products != nil
.map
$0.products!
.bind(to: (self.tableView?.rx.items(cellIdentifier: cellIdentifier, cellType: ProductCell.self))!)
(row, element, cell) in
self.showFullPageState(State.CONTENT)
cell.product = element
.disposed(by: bag)
self.tableView?.rx.setDelegate(self).disposed(by: bag)
这是我的 ViewModel :
func getProductListByID(orderGroup: String, page: String = "1", limit: String = "1000") -> Observable<ProductRes>
return orderRegApiClient.getProductsById(query: getProductQueryDic(stateKey: getNextStateID(product: nextProduct)
, type: orderGroup, page: page, limit: limit)).map
try JSONDecoder().decode(ProductRes.self, from: $0.data)
.asObservable()
我将 Moya 用于我的网络层,如下所示:
func getProductsById(query: [String: String]) -> Single<Response>
return provider.rx.request(.getProductsById(query))
.filterSuccessfulStatusCodes()
【问题讨论】:
【参考方案1】:您没有在任何地方处理错误。我的意思是您承认 do
运算符中的错误,但实际上并没有处理它,它只是允许它传递到无法处理错误的表视图。
查找catchError
系列运算符以获得解决方案。 .catchErrorJustReturn([])
可能就是您所需要的。
在评论中,你说:
...我不想将空数组返回到我的表中。我想向客户显示错误,客户可以重试服务
在这种情况下,您应该仅将.catchError
用于成功链,并为错误设置单独的链,如下所示。
fileprivate func getNextState()
showFullPageState(State.LOADING)
let products = viewModel.getProductListByID(orderGroup: OrderGroup.SERVICES.rawValue)
.share()
products
.catchError _ in Observable.never()
.filter $0.products != nil
.map $0.products!
.bind(to: tableView!.rx.items(cellIdentifier: cellIdentifier, cellType: ProductCell.self))
(row, element, cell) in
self.showFullPageState(State.CONTENT)
cell.product = element
.disposed(by: bag)
products
.subscribe(onError: error in
showStatusError(error: error)
self.showFullPageState(State.CONTENT)
)
.disposed(by: bag)
self.tableView?.rx.setDelegate(self).disposed(by: bag)
按照您设置代码的方式,用户重试服务的唯一方法是再次调用该函数。如果您想让用户以更具声明性的方式重试,则需要将链绑定到用户可以触发的可观察对象。
【讨论】:
感谢您的回答我理解我的错误。但我不想将空数组返回到我的表中。我想向客户显示错误,客户可以重试服务 我添加了新要求的答案。以上是关于处理 UITableView 绑定中的连接错误(Moya、RxSwift、RxCocoa)的主要内容,如果未能解决你的问题,请参考以下文章
使用 RxSwift 在 UITableView 中进行 2 路绑定
Node.js权威指南 (10) - Node.js中的错误处理与断言处理
React native - 连接没有连接处理程序错误含义?
无法绑定 v-on:单击 Vuetify [Vue 警告]:v-on 处理程序中的错误:“TypeError:handler.apply 不是函数”