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

标签 ios swift uirefreshcontrol rx-swift

我是 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/36358111/

相关文章:

ios - 使标题成为 UIButton 中可点击区域的一部分

swift - 为什么 where 子句仅对具有泛型参数的函数有效?

ios - UISearchBar 在向下滚动之前不可见

swift - 喜欢大标题和 RefreshControl 效果不佳

ios - 在 parse-server/iOS 上以安全的方式集成 LinkedIn 登录

ios - 如何在 Swift 项目中导入 LinkedIn SDK?

ios - 如果移出 CGPoint 则取消触摸

ios - Swift iOS 中的 Facebook 相册访问

ios - 滑动幻灯片并移动 imageView 位置

iphone - UIRefreshControl 背景色