Ios 网络调用后绑定到UIRefreshControl

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

我是RxSwift的新手,我想知道我如何能够“反应式”使用UIRefreshControl和UITableView,而不是以常规方式创建目标,并手动调用
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()
。是的,这就是我的意思。这还是新的接收东西。非常感谢你的帮助!