RxSwift Observable 不会在数据更改时更新表视图
RxSwift Observeable doesn't update tableview on data change
我设置了 table 视图并希望在数据更改时立即更新 UI。我使用调度程序模拟数据更改。但问题是,table 不会更新。有人可以解释如何使用 RxSwift 设置 table 视图以在数据更改时更新它的单元格吗?
@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)
}
您必须在数据更改后立即重新加载 tableView。要重新加载 tableView,请调用:
this.tableView.reloadData()
你没有提供你的 Chocolate 的实现,但我假设它是结构,在那种情况下你没有改变任何东西,因为在
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 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 的实现
在 swift5 中,变量已被弃用。所以最好你应该使用行为主题。要在其中传递值,请使用 OnNext 函数。如果它与 table 视图绑定,那么它将自动刷新新数据。
我设置了 table 视图并希望在数据更改时立即更新 UI。我使用调度程序模拟数据更改。但问题是,table 不会更新。有人可以解释如何使用 RxSwift 设置 table 视图以在数据更改时更新它的单元格吗?
@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)
}
您必须在数据更改后立即重新加载 tableView。要重新加载 tableView,请调用:
this.tableView.reloadData()
你没有提供你的 Chocolate 的实现,但我假设它是结构,在那种情况下你没有改变任何东西,因为在
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 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 的实现
在 swift5 中,变量已被弃用。所以最好你应该使用行为主题。要在其中传递值,请使用 OnNext 函数。如果它与 table 视图绑定,那么它将自动刷新新数据。