Ios 在RxMoya中重复请求

Ios 在RxMoya中重复请求,ios,swift,uitableview,rx-swift,moya,Ios,Swift,Uitableview,Rx Swift,Moya,我在RxSwift上使用最新版本的Moya,我遇到了一个逻辑问题,目前无法找到解决方案 假设我有一个UITableViewController,其ViewModel实现了以下接口: protocol ListViewModelType { var items: Observable<[Item]> { get } } 在UITableViewController的viewDidLoad方法中,我通过以下代码在items属性和tableView之间建立了绑定: self.

我在RxSwift上使用最新版本的Moya,我遇到了一个逻辑问题,目前无法找到解决方案

假设我有一个UITableViewController,其ViewModel实现了以下接口:

protocol ListViewModelType {

    var items: Observable<[Item]> { get }

}
在UITableViewController的viewDidLoad方法中,我通过以下代码在items属性和tableView之间建立了绑定:

self.viewModel.items
            .bind(to: tableView.rx.items(cellIdentifier: cellIdentifier, cellType: cellType)) { row, element, cell in
                // cell configuration code
            }
            .disposed(by: self.disposeBag)
现在,我想刷新UITableView的内容,以反映用户通过应用程序的其他部分所做的更改。考虑到RxMoyaProvider返回一个Observable,这应该通过Observable发出的另一个值轻松完成,但我不知道如何与提供者沟通,它应该从服务器刷新内容并将其放入同一个Observable中


我是不是遗漏了什么?是否有更推荐的方法将UITableView绑定到来自RxMoyaProvider的对象列表?

您必须重新加载我们的Moya请求。这有点老套,但我想你明白了

let didAppear = Variable(true)
override func viewDidAppear(_ animated: Bool) {
    didAppear.value = true
}

override func viewDidLoad(){
    self.didAppear.flatMap{ _ in self.viewModel.items}
        .bind(to: tableView.rx.items(cellIdentifier: cellIdentifier, cellType: cellType)) { row, element, cell in
            // cell configuration code
        }
        .disposed(by: self.disposeBag)
}
或者,您可以使用离线第一原则重新设计我们的架构


好的,我明白你关于离线第一原则的观点,但目前这不符合要求,我更愿意只坚持在线。你提出的方法看起来很像黑客……你确定没有其他方法来实现这一点,比如MoyaProvider的包装器吗?我真的不认为这样做有什么意义。如果没有离线firstWell,关键是要支持服务器的答案可能随时间变化的情况。可观测数据被描述为数据流,这正是我在这里所拥有的:每次我要求它刷新时,都会发出一个新值的数据流。是的,但你需要要求它刷新。这就是self.didAspect.flatMap{in self.viewModel.items}是的,你是对的。我只是想也许有某种预先设计好的方法可以做到这一点。无论如何,仅供参考,我也在Moya GitHub回购协议上讨论这一点,看看我们是否能找到一个更优雅的解决方案,少一点“黑客”,希望能集成到Moya本身。
let didAppear = Variable(true)
override func viewDidAppear(_ animated: Bool) {
    didAppear.value = true
}

override func viewDidLoad(){
    self.didAppear.flatMap{ _ in self.viewModel.items}
        .bind(to: tableView.rx.items(cellIdentifier: cellIdentifier, cellType: cellType)) { row, element, cell in
            // cell configuration code
        }
        .disposed(by: self.disposeBag)
}