gpt4 book ai didi

ios - 网络调用后绑定(bind)到 UIRefreshControl

转载 作者:行者123 更新时间:2023-11-28 08:23:47 24 4
gpt4 key购买 nike

我是 RxSwift 的新手,我想知道我如何能够“ react 性地”使用带有 UITableView 的 UIRefreshControl 而不是创建目标并手动调用 beginRefreshing() 的正常方式和 endRefreshing()

例如,假设我正在从 API 加载一些字符串:

class TableViewController: UITableViewController {

var data : [String] = []

let db = DisposeBag()

override func viewDidLoad() {
super.viewDidLoad()

refreshControl = UIRefreshControl()

//I don't want to use
//refreshControl?.addTarget(self, action: #selector(getData), forControlEvents: .ValueChanged)

//Do something to refreshControl.rx_refreshing?
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
let str = data[indexPath.row]
cell.textLabel?.text = str
return cell
}

//MARK: - Requests

private func getData() {
let myData = MyAPI.getData() //Returns Observable<[String]>
myData
.subscribe({ [weak self] (event) in
switch event {
case .Next(let strings):
self?.data = strings
self?.tableView.reloadData()
break
case .Error(let err):
print(err)
break
case .Completed:
break
}
// self?.refreshControl?.endRefreshing()
})
.addDisposableTo(db)
}
}

MyAPI 发送一些字符串值的请求,我如何绑定(bind) refreshControl 来调用 getData() 并在它停止刷新时完成(或错误)了网络请求?我需要绑定(bind)到 refreshControl.rx_refreshing 吗? ?

最佳答案

RxSwift 的示例应用程序提供了一个有趣的类来处理这种逻辑:ActivityIndicator .

一旦您拥有 ActivityIndi​​cator,将 rx_refreshing 绑定(bind)到请求的代码就变得非常简单。

let activityIndicator = ActivityIndicator()

override func viewDidLoad() {
super.viewDidLoad()

refreshControl = UIRefreshControl()

// When refresh control emits .ValueChanged, start fetching data
refreshControl.rx_controlEvent(.ValueChanged)
.flatMapLatest { [unowned self] _ in
return self.getData()
.trackActivity(activityIndicator)
}
.subscribeNext { [unowned self] strings in
self.data = strings
self.tableView.reloadData()
}
.addDisposableTo(db)

// Bind activity indicator true/false to rx_refreshing
activityIndicator.asObservable()
.bindTo(refreshControl.rx_refreshing)
.addDisposableTo(db)
}

// getData only needs to return an observable, subscription is handled in viewDidLoad
private func getData() -> Observable<[String]> {
return myData = MyAPI.getData() //Returns Observable<[String]>
}

关于ios - 网络调用后绑定(bind)到 UIRefreshControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40637771/

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