RxSwift Observeable не обновляет tableview при изменении данных

Я настраиваю tableview и хочу обновить пользовательский интерфейс, как только данные изменятся. Симулирую изменение данных с помощью диспетчера. Но проблема в том, что таблица не обновляется. Может кто-нибудь объяснить, как настроить табличное представление с RxSwift для обновления его ячейки при изменении данных?

  @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)
  }

person zeiteisen    schedule 11.05.2017    source источник


Ответы (3)


Вы не предоставили реализацию своего Шоколада, но я предполагаю, что это структура, в этом случае вы ничего не меняете, потому что в

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

ваш шоколад из europeanChocolates скопирован в новый вар 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 changed». Если я прав, это должно вам помочь:

  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.

person beretis    schedule 11.05.2017

В swift5 переменная устарела. Поэтому желательно использовать предметы поведения. Чтобы передать в него значение, используйте функцию OnNext. Если он связан с табличным представлением, он автоматически обновит новые данные.

person Talha Rasool    schedule 07.03.2020

Вам необходимо перезагрузить tableView сразу после изменения данных. Чтобы перезагрузить tableView, вызовите это:

this.tableView.reloadData()
person miltan    schedule 11.05.2017
comment
Это немного не по теме, потому что вопрос был о RxCocoa и наблюдаемых объектах, а не о том, как перезагрузить данные. - person beretis; 11.05.2017