gpt4 book ai didi

ios - 使用 RxSwift 和 RxCocoa 绑定(bind)模型并更新单元格

转载 作者:行者123 更新时间:2023-11-30 11:59:11 24 4
gpt4 key购买 nike

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

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)

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

最佳答案

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

struct MyState: RaspState {
var price: Float = 0.0

mutating func apply(event: RaspEvent) {
switch event {
case let priceEvent as PriceEvent:
self.price = priceEvent.price
default:
break
}
}
}

struct PriceEvent: RaspEvent {
let price: Float
}

let myAggregator = RaspAggregator<MyState>(initial: MyState())

let priceSelector = RaspSelector<MyState, Float> { state -> Float in
let value: Float = state.price
return value
}

let price = myAggregator.select(selector: priceSelector)

price.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
myAggregator.manual(PriceEvent(price: value) as RaspEvent)
print(product)
}).disposed(by: self.bag)
}.disposed(by: bag)

显然,除了价格之外,您还可以在状态对象中存储许多其他内容。

关于ios - 使用 RxSwift 和 RxCocoa 绑定(bind)模型并更新单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47458203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com