Bro*_*nts 6 reactive-programming ios swift rx-swift
我在演示中学习了一个例子来创建一个UITableView并渲染单元格.
在我看来,items是viewModel,我想通过使用Alamofire或其他库来请求跨网络的一些数据.当我收到回复时,如何更新相关单元格的文本?
换句话说,我想将viewModel绑定到Cells.当模型的数据发生变化时,单元格的内容可能会自动更改.
我有一个想法是:为单元格的内容创建一个Observable序列(绑定到单元格).当服务器响应数据时,它调用函数tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top).但这似乎不是一种优雅或好的方法.
所以,希望有些人可以帮助我:)
let items = Observable.just([
"First Item",
"Second Item",
"Third Item"
])
items
.bindTo(tableView.rx_itemsWithCellIdentifier("Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
cell.textLabel?.text = "\(element) @ row \(row)"
/* to do some binding or something else ? */
}
.addDisposableTo(disposeBag)
tableView
.rx_modelSelected(String)
.subscribeNext { value in
DefaultWireframe.presentAlert("Tapped `\(value)`")
}
.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)
你的client(Alomofire,......)会有这样的:
func searchSomething() -> Observable<[YourModel]>
Run Code Online (Sandbox Code Playgroud)
在viewModel您将拥有该items属性:
private(set) lazy var items : Observable<[YourModel]> =
self.client.searchSomething()
.observeOn(MainScheduler.instance)
.shareReplay(1)
Run Code Online (Sandbox Code Playgroud)
然后,在viewController:
tableView.dataSource = nil
// Bind the items to the table view data source
viewModel.items
.bindTo(tableView.rx.items) { tableView, index, item in
let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell")
cell.textLabel?.text = item.title // if item.title is a String
return cell
}
.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)
更改为变量并更改值
let items = Variable([
"First Item",
"Second Item",
"Third Item"
])
items
.bindTo(tableView.rx_itemsWithCellIdentifier("Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
cell.textLabel?.text = "\(element) @ row \(row)"
/* to do some binding or something else ? */
}
.addDisposableTo(disposeBag)
tableView
.rx_modelSelected(String)
.subscribeNext { value in
DefaultWireframe.presentAlert("Tapped `\(value)`")
items.value = ["item 1", "item 2"] //your updated array
}
.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)