使用RxSwift和RxCocoa绑定模型并更新单元格

时间:2017-11-23 14:51:04

标签: ios iphone swift reactive-programming rx-swift

我有一个产品$,它是Variable< [Product]>([]),并且有一个带有textfield的自定义单元格的tableview。我想要的是在模型更改时更新单元格,当文本字段更改时我想要更新我的模型。这就是我做的。

products$.asObservable()
        .bind(to: self.tableViewCal.rx.items(cellIdentifier: "edittingCell")){ (row, product: Product, cell: CaloriesEdittingCell) in
            cell.lblContentName.text = self.products$.value[row].name ?? ""
            cell.textValue.text = "\(self.products$.value[row].price ?? 0)"
            cell.textValue.rx.text
                .map({ value -> Float in
                    return (value! as NSString).floatValue
                })
                .subscribe({value in
                    self.products$.value[row].price = value.element
                    print(product)
                }).disposed(by: self.bag)
        }.disposed(by: bag)
显然,它会陷入循环中。所以我做的是创建了另一个具有相同数据类型的tempProduct $,并将product $的值赋给tempProduct $。这是代码

tempProduct$.value = products$.value
tempProduct$.asObservable()
        .bind(to: self.tableViewCal.rx.items(cellIdentifier: "edittingCell")){ (row, product: Product, cell: CaloriesEdittingCell) in
            cell.lblContentName.text = self.products$.value[row].name ?? ""
            cell.textValue.text = "\(self.products$.value[row].price ?? 0)"
            cell.textValue.rx.text
                .map({ value -> Float in
                    return (value! as NSString).floatValue
                })
                .subscribe({value in
                    self.products$.value[row].price = value.element
                    print(product)
                }).disposed(by: self.bag)
        }.disposed(by: bag)

它有效,但如果有更好的解决方案,请告诉我。提前谢谢。

1 个答案:

答案 0 :(得分:0)

对于这类事情,更好的架构选择是遵循单向数据流原则。有关一般介绍,请参阅https://redux.js.org/docs/basics/DataFlow.html。使用RaspSwift的可能实现就像 -

{{1}}

显然,除了价格之外,你还可以在状态对象中存储很多其他东西。