在 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 中重复请求的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift 取消 RxMoya 网络请求

使用 RxMoya 在 RxSwift 上未获得 Completed 事件

如何正确过滤 RxMoya 中的SuccessfulStatusCodes

Vue路由切换&Axios接口取消重复请求

如何在scrapy中根据url过滤重复请求

使用 Laravel 在 Azure 中来自单个请求的多个重复 HTTP 请求/查询