在 RxMoya 中重复请求
Posted
技术标签:
【中文标题】在 RxMoya 中重复请求【英文标题】:Repeat request in RxMoya 【发布时间】:2017-07-03 12:51:10 【问题描述】:我正在使用最新版本的 Moya 和 RxSwift,但我遇到了一个逻辑问题,目前我找不到解决方案。
假设我有一个带有 ViewModel 的 UITableViewController,它实现了以下接口:
protocol ListViewModelType
var items: Observable<[Item]> get
items
属性实现为(使用 EVReflection):
var items: Observable<[Therapy]>
get
let provider = RxMoyaProvider<ItemService>()
return provider
.request(.all)
.map(toArray: Item.self)
在 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 的对象列表?
【问题讨论】:
【参考方案1】:您必须重新加载我们的 Moya 请求。这有点hacky,但我想你明白了。
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)
或者,您可以使用离线优先原则重新设计我们的架构
【讨论】:
好的,我明白你关于离线优先原则的观点,但目前超出了要求,我更愿意坚持仅在线。你提出的方法看起来很像一个 hack……你确定没有办法使用其他东西来实现这个,比如 MoyaProvider 的包装器,也许? 我真的没有看到这样做的意义。没有离线第一 嗯,重点是支持服务器的答案可能随时间变化的情况。 Observables 被描述为数据流,恕我直言,这正是我在这里所拥有的:每次我要求刷新时都会发出一个新值的数据流。 是的,但您需要要求它刷新。就是这个位 self.didAppear.flatMap _ in self.viewModel.items 是的,你是对的。我只是想也许有某种预先设计的方法可以做到这一点。无论如何,仅供参考,我也在 Moya GitHub repo 上讨论这个问题,看看我们是否能找到一个更优雅的解决方案,少一点“hacky”,并希望能集成到 Moya 本身中。以上是关于在 RxMoya 中重复请求的主要内容,如果未能解决你的问题,请参考以下文章
使用 RxMoya 在 RxSwift 上未获得 Completed 事件