我正在研究一种方法来监听对象的变化。下面的代码片段是我正在进行的解决方案。
在这里,每当isSelected bool更改时,我必须更新UI。
class OfferDetail: ObservableObject {
@Published var items: [OfferItem]
private var anyCancellables = Set<AnyCancellable>()
init(deliveryAddress: String, deliveryDate: String, offerItems: [OfferItem]) {
self.items = offerItems
for item in items {
item.$isSelected
.sink(receiveValue: { _ in
print("OfferDetail Update 1")
self.objectWillChange.send()
})
.store(in: &anyCancellables)
}
}
}
class OfferItem: Identifiable, ObservableObject {
@Published var isSelected: Bool = false
let uuid = UUID()
init() {
print(uuid)
}
}
class ViewModel: ObservableObject {
@Published var offer: OfferDetail?
private var anyCancellables = Set<AnyCancellable>()
init() {
offer = OfferDetail(deliveryAddress: "", deliveryDate: "", offerItems: [OfferItem(), OfferItem()])
offer?.$items.sink { items in
print("ViewModel Update 2")
for item in items {
print(item.uuid, item.isSelected)
}
}.store(in: &anyCancellables)
}
}
let viewModel = ViewModel()
viewModel.offer?.items.first?.isSelected = true
这是监听数组中对象变化的正确方法吗?
1条答案
按热度按时间7d7tgy0s1#
当你有一个
ObservableObject
并将某个值标记为@Published
时,你就要求系统在该值发生变化时发送一条消息。@Published
属性属性将在willSet
上发送更改通知。在这里,您将发送的通知数量增加了一倍。框架将在willSet
上发送一个,而您已经要求在didSet
上发送第二个更改通知。您可能不应该这样做(请注意,您在逻辑上不一致的didSet
中调用对象WillChange。作为一般的经验法则,如果你发现自己调用
objectWillChange
,你应该仔细考虑是否真的需要这样做。在特殊情况下可能需要这样做,但大多数情况下应该由框架来处理。总的来说,我认为你在这里有一点xy problem。不清楚你想完成什么,问“最好”的方法做某事更有可能引起意见而不是答案。