swift 使用合并观察数组对象中的属性更改

5n0oy7gb  于 2023-05-05  发布在  Swift
关注(0)|答案(1)|浏览(209)

我正在研究一种方法来监听对象的变化。下面的代码片段是我正在进行的解决方案。
在这里,每当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

这是监听数组中对象变化的正确方法吗?

7d7tgy0s

7d7tgy0s1#

class OfferItem: Identifiable, ObservableObject {
    
    //var status: String?
    @Published var isSelected: Bool = false {
        didSet {
            print("new value", isSelected)
            objectWillChange.send()
        }
    }
}

当你有一个ObservableObject并将某个值标记为@Published时,你就要求系统在该值发生变化时发送一条消息。@Published属性属性将在willSet上发送更改通知。在这里,您将发送的通知数量增加了一倍。框架将在willSet上发送一个,而您已经要求在didSet上发送第二个更改通知。您可能不应该这样做(请注意,您在逻辑上不一致的didSet中调用对象WillChange。
作为一般的经验法则,如果你发现自己调用objectWillChange,你应该仔细考虑是否真的需要这样做。在特殊情况下可能需要这样做,但大多数情况下应该由框架来处理。
总的来说,我认为你在这里有一点xy problem。不清楚你想完成什么,问“最好”的方法做某事更有可能引起意见而不是答案。

相关问题