swift - 惯用的 Swift 多重通知?

标签 swift design-patterns notifications idioms generics

我正在定义一个类结构,它需要在发生有趣的事情(获取新数据等)时通知其使用者。类似于委托(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/

相关文章:

ios - 为什么 swift 协议(protocol)使用函数重载而不是不同名称的 func ?

swift - 我可以为我的 NSCoding 类覆盖 swift 每模块命名空间吗? (我需要 Module1.MyCodedClass == Module2.MyCodedClass)

design-patterns - 你能说出多少个非 GOF 模式?

design-patterns - 贫血领域模型与领域模型

javascript - 通过访问器为函数传递标志——它是哪种 JavaScript 模式?

android - 处理后台通知

javascript - 当页面中发生有趣的事情时如何照亮浏览器窗口/选项卡?

swift - 如何在从命令行编译的 Swift 应用程序中使用文件夹?

ruby-on-rails - 如何在移动应用后端处理阅读通知

ios - 使用未解析的标识符 : PFTwitterUtils swift