带有 RxSwift 的 UIRefreshControl
Posted
技术标签:
【中文标题】带有 RxSwift 的 UIRefreshControl【英文标题】:UIRefreshControl with RxSwift 【发布时间】:2017-03-30 09:46:22 【问题描述】:您好,我正在尝试使 UIRefreshControl 与 RxSwift 一起工作。因此,我使用的是 RxSwift 示例中的 Activity Indicator。
在我的 viewModel 中,我有以下函数和变量来获取我的数据。
// MARK: - Variables
var data = Variable<[Data]>([])
// MARK: - Public Interface
func getData()
let request = Data.readAll()
_ = request.rxResult().subscribe(onNext: response in
self.data.value = response.data
, onError: (Error) in
, onCompleted:
, onDisposed:
)
然后在我的视图控制器中,我尝试将它绑定到 UIRefreshcontrol 和我拥有的集合视图。
let refresher: UIRefreshControl = UIRefreshControl()
let indicator = ActivityIndicator()
indicator.asObservable()
.bindTo(refresher.rx.isRefreshing)
.addDisposableTo(disposeBag)
let resultObservable = viewModel.data.asObservable()
.trackActivity(indicator)
.bindTo(self.collectionView.rx.items(cellIdentifier: reuseCell, cellType: DataCollectionViewCell.self))
row, data, cell in
cell.configureCell(with: data)
resultObservable.addDisposableTo(disposeBag)
我的问题是,我缺少什么来完成这项工作?现在,如果我启动应用程序,除了一个不停旋转的黑色活动指示器之外,什么也没有发生。
【问题讨论】:
我猜你需要在单元格中配置数据后停止活动指示器。也许您可以找出可以阻止它的事件。 但是我该怎么做呢?这就是问题 【参考方案1】:我认为您应该更喜欢在 ViewController 中订阅并将该订阅添加到该视图控制器的处置包中。
我认为以下方式是使用 RxExamples 中的 ActivityIndicator 的正确方式。以下是伪代码。
/// ViewController.swift
import RxSwift
import RxCocoa
…
let refreshControl = UIRefreshControl()
refreshControl.rx.controlEvent(.valueChanged)
.bind(to:self.viewModel.inputs.loadPageTrigger)
.disposed(by: disposeBag)
self.viewModel.indicator
.bind(to:refreshControl.rx.isRefreshing)
.dispose(by:disposeBag)
…
/// ViewModel.swift
…
let loadTrigger = PublishSubject<Void>()
let indicator = ActivityIndicator().asDriver()
…
// Assuming rxResult returns Observable<Response>
let req = indicator.asObservable()
.sample(loadTrigger)
.flatMap isLoading -> Observable<Response> in
if isLoading return Observable.empty()
return Data.readAll().rxResult()
.trackActivity(indicator)
.map $0.data
.do(onNext: [unowned self] data in
self.data.value = data
)
…
【讨论】:
【参考方案2】:refresher
.rx.controlEvent(UIControlEvents.valueChanged)
.subscribe(onNext: [weak self] in
//Put your hide activity code here
self?.refresher.endRefreshing()
, onCompleted: nil, onDisposed: nil)
.disposed(by: disposeBag)
订阅刷新事件(UIRefreshControl)
【讨论】:
以上是关于带有 RxSwift 的 UIRefreshControl的主要内容,如果未能解决你的问题,请参考以下文章