Ios 网络调用后绑定到UIRefreshControl
我是RxSwift的新手,我想知道我如何能够“反应式”使用UIRefreshControl和UITableView,而不是以常规方式创建目标,并手动调用Ios 网络调用后绑定到UIRefreshControl,ios,swift,uirefreshcontrol,rx-swift,Ios,Swift,Uirefreshcontrol,Rx Swift,我是RxSwift的新手,我想知道我如何能够“反应式”使用UIRefreshControl和UITableView,而不是以常规方式创建目标,并手动调用beginRefreshing()和endRefreshing() 例如,假设我正在从API加载一些字符串: class TableViewController: UITableViewController { var data : [String] = [] let db = DisposeBag() overri
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)
}
}
类TableViewController:UITableViewController{
变量数据:[字符串]=[]
设db=dispebag()
重写func viewDidLoad(){
super.viewDidLoad()
refreshControl=UIRefreshControl()
//我不想用
//refreshControl?.addTarget(self,action:#选择器(getData),forControlEvents:.ValueChanged)
//是否执行某些操作以刷新Control.rx\u刷新?
}
重写func tableView(tableView:UITableView,cellForRowAtIndexPath:nsindepath)->UITableView单元格{
让cell=tableView.dequeueReusableCellWithIdentifier(“cell”,forIndexPath:indexPath)
设str=data[indexPath.row]
cell.textlab?.text=str
返回单元
}
//马克:-请求
私有函数getData(){
让myData=MyAPI.getData()//返回可观察的
我的数据
.subscribe({[弱自我](事件)在中)
切换事件{
case.Next(让字符串):
self?数据=字符串
self?.tableView.reloadData()
打破
case.Error(let err):
打印(错误)
打破
案件.已完成:
打破
}
//self?.refreshControl?.endRefreshing()
})
.addDisposableTo(db)
}
}
MyAPI
发送一些字符串值的请求,如何绑定refreshControl
调用getData()
并在完成(或出错)网络请求时停止刷新?我需要绑定到吗?RxSwift的示例应用程序提供了一个有趣的类来处理这种逻辑:
在中设置了ActivityIndicator
后,将rx\u刷新
绑定到请求的代码变得非常简单
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]>
}
let activityIndicator=activityIndicator()
重写func viewDidLoad(){
super.viewDidLoad()
refreshControl=UIRefreshControl()
//当刷新控件发出.ValueChanged时,开始提取数据
refreshControl.rx_controlEvent(.ValueChanged)
.flatMapLatest{[无主自]uuin
返回self.getData()
.trackActivity(activityIndicator)
}
.SubscribeText{[unowned self]字符串位于
self.data=字符串
self.tableView.reloadData()
}
.addDisposableTo(db)
//将活动指示器真/假绑定到rx\u刷新
activityIndicator.asObservable()
.bindTo(刷新控制.rx_刷新)
.addDisposableTo(db)
}
//getData只需要返回一个可观察的,订阅在viewDidLoad中处理
private func getData()->可观察{
return myData=MyAPI.getData()//返回可观察的
}
RxSwift的示例应用程序提供了一个有趣的类来处理这种逻辑:
在中设置了ActivityIndicator
后,将rx\u刷新
绑定到请求的代码变得非常简单
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]>
}
let activityIndicator=activityIndicator()
重写func viewDidLoad(){
super.viewDidLoad()
refreshControl=UIRefreshControl()
//当刷新控件发出.ValueChanged时,开始提取数据
refreshControl.rx_controlEvent(.ValueChanged)
.flatMapLatest{[无主自]uuin
返回self.getData()
.trackActivity(activityIndicator)
}
.SubscribeText{[unowned self]字符串位于
self.data=字符串
self.tableView.reloadData()
}
.addDisposableTo(db)
//将活动指示器真/假绑定到rx\u刷新
activityIndicator.asObservable()
.bindTo(刷新控制.rx_刷新)
.addDisposableTo(db)
}
//getData只需要返回一个可观察的,订阅在viewDidLoad中处理
private func getData()->可观察{
return myData=MyAPI.getData()//返回可观察的
}
非常感谢!当我尝试它时,我必须将activityIndicator.asDriver()
更改为activityIndicator.asObservable()
,否则它将给出类型为Driver has no member bindTo的值。另外,如何以编程方式将控件事件推送到refreshControl?我尝试了refreshControl.beginRefreshing()
,但没有成功。通过编程方式发送事件,您试图实现什么目的?如果希望在执行viewDidLoad
时执行第一个getData()
,最好在.flatMapLatest
之前使用.startWith()
。我已经将答案更新为使用.asObservable()
。是的,这就是我的意思。这还是新的接收东西。非常感谢你的帮助!非常感谢!当我尝试它时,我必须将activityIndicator.asDriver()
更改为activityIndicator.asObservable()
,否则它将给出类型为Driver has no member bindTo的值。另外,如何以编程方式将控件事件推送到refreshControl?我尝试了refreshControl.beginRefreshing()
,但没有成功。通过编程方式发送事件,您试图实现什么目的?如果希望在执行viewDidLoad
时执行第一个getData()
,最好在.flatMapLatest
之前使用.startWith()
。我已经将答案更新为使用.asObservable()
。是的,这就是我的意思。这还是新的接收东西。非常感谢你的帮助!