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