我正在定义一个类结构,它需要在发生有趣的事情(获取新数据等)时通知其使用者。类似于委托(delegate)关系,但可能有多个消费者。比类型转换一个更直接的关系 NSNotification
风中。
在大多数 Objective-C 程序中,我倾向于定义一个协议(protocol),让那些消费者实现它并将自己注册为 id<MyProtocol>
。 ;我会把它们塞进 NSMutableSet
,我会在适当的时候对其进行迭代。我花在编写 C# 上的时间会让我尝试稍微修改该方法以在 Swift 中使用泛型(la private var myConsumers = Set<MyProtocol>()
)。据我所知,那原来是一个黑暗而痛苦的兔子洞。但与其一头扎进去,让我后退并尝试解决真正的问题。
所以:我有一些类,其中实例需要将发生的有趣事情通知 0-N 消费者。允许这些消费者自己注册和注销会很好,因为他们的生命周期可能比我的类(class)短。
实现此模式的惯用 Swift 方法是什么?
最佳答案
Cocoa 中多委托(delegate)的惯用解决方案是通知,特别是使用 addObserverForName(object:queue:usingBlock:)
.通过你的关闭。保存返回值,并在以后使用该返回值注销自己。
有 ObjC 多播委托(delegate)(Robbie Hanson's 可能是我最喜欢的,除了我已经实现的委托(delegate)),但大多数时候它的麻烦多于它的值(value)。通知是 Cocoa 管理非代理观察者的方式。
“非委托(delegate)”在这里的意思是“被通知的事情,但从来没有问过任何事情”。 “多代表”的问题在于它实际上是一个无意义的术语。 “代表”是您要求提供信息的东西;您“委派”了一项决定的责任。观察员并不是真正的“代表”(尽管代表有时也是观察员)。你什么都不问他们。他们无法控制决策。所以多代表是无稽之谈。多个事物怎么可能都负责回答一个问题呢?为了使这个更具体,代表们有非 void
方法。考虑为 UITableViewDelegate
设置“多代表”意味着什么.您如何决定行高是多少?
如果您要自己构建,我可能会推荐 Dictionary<Key, ()->Void>
其中“key”是您返回给调用者以供以后删除的句柄。这样您就不必担心闭包相等性的疯狂(我同意 Chris Lattner 的观点,这是一个非常开放且可能无法解决的问题)。
关于swift - 惯用的 Swift 多重通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28503875/