gpt4 book ai didi

ios - 组合:监听内部集合变化

转载 作者:行者123 更新时间:2023-11-29 05:36:02 27 4
gpt4 key购买 nike

我有一个封装对象集合的数据管理器。我想监听该管理器中的更改以及集合对象中的更改。我使用 PassthroughSubjectsink 提出了解决方案,但我对合并还很陌生,想知道它是否正确以及是否有更好的方法来做到这一点。

import Combine

class Item {
var data = false {
didSet {
self.subject.send()
}
}
let subject = PassthroughSubject<Void, Never>()

}

class DataManager {
private(set) var items = [Item]() {
didSet {
self.subject.send()
}
}
let subject = PassthroughSubject<Void, Never>()

func addItem(_ item: Item) {
self.items.append(item)
item.subject.sink { [weak self] in
self?.subject.send()
}
}
}

var item = Item()
var manager = DataManager()
manager.subject.sink {
print("Received Update")
}
manager.addItem(item) // Received Update
item.data = false // Received Update
item.data = true // Received Update

最佳答案

如果您可以控制存储的项目,那么将它们设置为所有结构都应该可行。数组是结构体,因此在更改时会触发 didSet。数组内部的结构应该更改数组的值并导致 didSet 为数组触发。类不会,因为类的引用值永远不会改变。当前的立场是,除非您有充分的理由使用类,否则您应该使用结构而不是类。 swift documentation了解更多信息。

另一个选择是做你已经在做的事情,让所有的类都符合一些协议(protocol),比如 BindableObject ,然后监控didChange对于每个对象。

目前,当从数组中删除项目时,您不处理取消。你应该subscribe didChangeDataManagerdidChange每个元素。然后取结果AnyCancellable并将其添加到该项目下键入的字典中。然后,一旦该项目从数组中删除,您应该删除关联的 AnyCancellable这将取消订阅。

关于ios - 组合:监听内部集合变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57029093/

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