RxSwift Observeable不会更新有关数据更改的tableview

时间:2017-05-11 12:05:17

标签: ios swift uitableview rx-swift

我设置了tableview,并希望在数据更改后立即更新UI。我使用调度程序模拟数据更改。但问题是,表格不会更新。有人可以解释如何使用RxSwift设置tableview来更新它的数据更改单元吗?

  @IBOutlet private var tableView: UITableView!
  let europeanChocolates: Variable<[Chocolate]> = Variable([])
  let disposeBag = DisposeBag()

  //MARK: View Lifecycle

  override func viewDidLoad() {
    super.viewDidLoad()
    title = "Chocolate!!!"
    setupCellConfiguration()
    europeanChocolates.value = Chocolate.ofEurope
    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
      var choclate = self.europeanChocolates.value[0]
      choclate.countryName = "Denmark"
    }

  }

  //MARK: Rx Setup

  private func setupCellConfiguration() {
    europeanChocolates.asObservable().bindTo(tableView.rx.items(cellIdentifier: ChocolateCell.Identifier, cellType: ChocolateCell.self)) {
      row, chocolate, cell in
      cell.configureWithChocolate(chocolate: chocolate)
    }
    .addDisposableTo(disposeBag)
  }

3 个答案:

答案 0 :(得分:3)

你没有提供巧克力的实现,但我认为它是结构,在这种情况下你没有改变任何东西,因为在

    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
  var choclate = self.europeanChocolates.value[0]
  choclate.countryName = "Denmark"
}

来自europeanChocolates的巧克力被复制到新的var choclate,但你永远不会保存它。如果你试试这个,你可以轻松检查它

  override func viewDidLoad() {
    super.viewDidLoad()
    title = "Chocolate!!!"
    setupCellConfiguration()
    europeanChocolates.value = Chocolate.ofEurope
    europeanChocolates.asObservable().subscribe(onNext: { choco in
        print("choco changed \(choco)")
    })
    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
      var choclate = self.europeanChocolates.value[0]
      choclate.countryName = "Denmark"
    }

  }

我认为它不会打印“choco已更改”。如果我对,这应该可以帮助你:

  override func viewDidLoad() {
    super.viewDidLoad()
    title = "Chocolate!!!"
    setupCellConfiguration()
    europeanChocolates.value = Chocolate.ofEurope
    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
      var choclate = self.europeanChocolates.value[0]
      choclate.countryName = "Denmark"
      self.europeanChocolates.value[0] = choclate
    }

  }

如果没有帮助,请提供Chocolate和ChocolateCell的实施

答案 1 :(得分:0)

在swift5中,变量已被弃用。因此,最好使用行为主题。要在其中传递值,请使用OnNext函数。如果它与表视图绑定,那么它将自动刷新新数据。

答案 2 :(得分:-7)

您必须在数据更改后重新加载tableView。要重新加载tableView,请调用:

this.tableView.reloadData()