如何使用RxSwift更新UITableViewCell?

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)

XFr*_*ire 5

你的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)


Art*_*syn 0

更改为变量并更改值

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)