gpt4 book ai didi

ios - 对于一对多的关系 : NotificationCenter or multicasting delegate?

转载 作者:搜寻专家 更新时间:2023-11-01 06:53:10 26 4
gpt4 key购买 nike

如果委托(delegate)是为对象之间的一对一关系设计的,而 NSNotifications 是为一对多的潜在关系设计的,那么是否有针对一对多的最佳实践?

我在 iOS 中看到过很多自定义多播委托(delegate),其中一个对象可以转换到多个订阅者(即 Swift Language Multicast Delegate ),但实现通常非常复杂并且看起来有点矫枉过正。一个这样的问题是安全地存储一组弱引用(委托(delegate))(How do I declare an array of weak references in Swift?)。

我看过很多建议(比如这个 multiple listeners for delegate iOS ),这些建议表明这就是 NotificationCenter 的用途。但是,为一对多的关系向以太广播的想法本身似乎有点过分了。

Apple 的框架和 Swift 语言是否有最佳实践?我从来没有看到他们写过这个。 NotificationCenter 是否适合用于一对多关系,否则需要多播委托(delegate)?

最佳答案

我不会使用 NotificationCenter,因为发送者和接收者(观察者)之间的消息类型和数据会丢失。使用 Notification Center 将使您的代码依赖于 Notification 对象,您需要使用通知的 userInfo 字典来添加数据,这使得更难理解到底是什么保留了通知(需要查看发送通知时数据的填充方式)。

委托(delegate)是一个更好的解决方案,在弱委托(delegate)列表中有超过 1 个委托(delegate)是可以的。我在很多地方使用过这样的组合,在这些地方我需要为特定事件注册超过 1 个监听器并且工作正常。

您可以创建一次委托(delegate)集合并在代码中非常轻松地重用它。这是我的解决方案:

class WeakContainer {

private weak var value: AnyObject?

public init(value: AnyObject) {
self.value = value
}

func get() -> AnyObject? {
return self.value
}
}

class DelegatesCollection<T>: Sequence {

private lazy var weakDelegates = [WeakContainer]()

var delegates: [T] {
return self.weakDelegates.map() { $0.get() as! T }
}

var hasDelegates: Bool {
return !self.weakDelegates.isEmpty
}

init() { }

func add(delegate: T) {
var exists = false
for currentDelegate in self.weakDelegates {
if(currentDelegate.get() === (delegate as AnyObject)) {
exists = true
break
}
}

if(!exists) {
self.weakDelegates.append(WeakContainer(value: delegate as AnyObject))
}
}

func remove(delegate: T) {
var i = 0
for currentDelegate in self.weakDelegates {
if(currentDelegate.get() == nil || currentDelegate.get() === (delegate as AnyObject)) {
self.weakDelegates.remove(at: i)
break
}

i += 1
}
}

func makeIterator() -> IndexingIterator<[T]> {
return self.delegates.makeIterator()
}
}

我可以推测 Apple 框架只使用单个委托(delegate),因为调用委托(delegate)时要执行的操作是业务逻辑。从 Apple 的角度来看,委托(delegate)某个事件已经发生并让应用程序决定下一步做什么就足够了,因此在框架级别支持多个委托(delegate)是没有意义的。

关于ios - 对于一对多的关系 : NotificationCenter or multicasting delegate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55753871/

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