【问题标题】:Handle Connection Error in UITableView Binding (Moya, RxSwift, RxCocoa)处理 UITableView 绑定中的连接错误(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()
    }

【问题讨论】:

    标签: ios swift rx-swift rx-cocoa rx-binding


    【解决方案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)
    }
    

    按照您设置代码的方式,用户重试服务的唯一方法是再次调用该函数。如果您想让用户以更具声明性的方式重试,则需要将链绑定到用户可以触发的可观察对象。

    【讨论】:

    • 感谢您的回答我理解我的错误。但我不想将空数组返回到我的表中。我想向客户显示错误,客户可以重试服务
    • 我添加了新要求的答案。
    猜你喜欢
    • 2016-08-23
    • 2017-01-12
    • 1970-01-01
    • 2019-03-17
    • 2023-03-12
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多