networking调用后绑定到UIRefreshControl

我是新来RxSwift,我想知道如何能够“反应”使用UITefView与UITableView而不是创build目标的正常方式,并手动调用beginRefreshing()endRefreshing()

例如,说我从API加载一些string:

 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发送一个string值的请求,我怎样绑定refreshControl来调用getData()并且在networking请求完成(或错误)时也停止刷新? 我是否需要绑定到refreshControl.rx_refreshing ?

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

一旦你有了ActivityIndicator ,绑定rx_refreshing到请求的代码变得非常简单。

 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]> }