gpt4 book ai didi

ios - 如何在处理 catchError 后恢复数据源

转载 作者:行者123 更新时间:2023-11-30 12:55:26 26 4
gpt4 key购买 nike

我有一个 UITableView,它由使用 RxSwift 的响应式(Reactive) View 模型填充,分页和刷新运行良好。 viewModel.dataSource() 正在使用我的 API,有时我会收到解析为错误类型的空结果。

我想捕获此错误并创建一个空状态,隐藏 tableview 并显示一个emptyViewState。我想我可以用 catchError 来实现。

我的问题是在catchError之后,数据源被释放,我无法恢复空状态并重新填充 TableView ,我尝试重新创建调用self.bindDataSource()的数据源,但出现 fatal error 。

有办法避免 dataSource 被丢弃吗?如何重新连接/重建数据源以从空状态恢复?

class MyViewControl: UIViewController {

fileprivate let disposeBag = DisposeBag()
fileprivate let viewModel = ViewModel()
let dataSource = SearchViewModel.SearchDataSource()

@IBOutlet fileprivate weak var tableView: UITableView!
@IBOutlet weak var emptyStateView: UIView!

override func viewDidLoad() {
super.viewDidLoad()

// When I disable tableview, can see a hidden view with empty state message and one button
viewModel.isTableViewHidden
.bindTo(tableView.rx.isHidden)
.addDisposableTo(disposeBag)
self.setupTableView()
}

fun setupTableView() {
// ... setup table view
self.bindDataSource()
}
fileprivate func bindDataSource() {
// Bind dataSource from search to UITableView
viewModel.dataSource()
.debug("[DEBUG] Loading Search Tableview ")
.bindTo( tableView.rx.items(dataSource: dataSource) )
.addDisposableTo( disposeBag )
}

@IBAction fileprivate func emptyStateAction(_ sender: UIButton) {
// Do something and try to recreate the bindDataSource
self.bindDataSource()
}
}

class SearchViewModel {
private let disposeBag = DisposeBag()
typealias SearchDataSource = RxTableViewSectionedReloadDataSource<PaginationStatus<WorkerEntity>>

let isTableViewHidden = BehaviorSubject<Bool>(value: false)

// Controls to refresh and paging tableview
let refreshTrigger = BehaviorSubject<Void>(value:())
let nextPageTrigger = PublishSubject<Void>()

// Others things happing herer

func dataSource() -> Observable<[PaginationStatus<WorkerEntity>]> {
return self.refreshTrigger.debug("[DEBUG] Refreshing dataSource")
.flatMapLatest { [unowned self] _ -> Observable<[PaginationStatus<WorkerEntity>]> in
// Access the API and return dataSource
}
.catchError { [unowned self] error -> Observable<[PaginationStatus<WorkerEntity>]> in
// Hidden the tableview
self.isTableViewHidden.onNext(true)
// Do others things
return Observable.of([PaginationStatus.sectionEmpty])
}
}
}

最佳答案

当您bindDataSource()时,您不会重新初始化数据源,因此您将其绑定(bind)到错误事件。您需要初始化它,才能再次绑定(bind)它。您可能也想删除绑定(bind)

让 disposeBagTableView = DisposeBag()

//remove
let dataSource = SearchViewModel.SearchDataSource()


fileprivate func bindDataSource() {
// Bind dataSource from search to UITableView
disposeBagTableView = DisposeBag()
SearchViewModel.SearchDataSource()
.debug("[DEBUG] Loading Search Tableview ")
.bindTo( tableView.rx.items(dataSource: dataSource) )
.addDisposableTo( disposeBagTableView )
}

关于ios - 如何在处理 catchError 后恢复数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40456763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com