Swift 代表在 2 个地方设置单例

Posted

技术标签:

【中文标题】Swift 代表在 2 个地方设置单例【英文标题】:Swift Delegate set on a singleton at 2 places 【发布时间】:2021-11-09 02:24:51 【问题描述】:

我有一个名为 GameCenterFacade 的单例。在我的应用主页 ViewController 我设置:

GameCenterFacade.shared.delegate = self

然后,我在作为主页 ViewController 的实例变量的自定义类中使用相同的代码。这似乎将 GameCenterFacades 的共享委托更新为 Instance 变量而不是 ViewController。因此,协议方法仅在自定义类中调用,而不在 ViewController 中调用。

有没有一种巧妙的方法可以将 View Controller 和 Instance Variable 自定义类设置为 GameCenterFacade 的单例委托?我猜是因为它是一个单例,它只能有 1 个委托?

【问题讨论】:

也许您需要发布/订阅解决方案? 【参考方案1】:

委托设计模式是一对一的模式。任何给定对象只有一个委托。

也就是说,创建自己的多代表模式并不难。为您想要拥有多个委托(multiDelegates,我们称它们)的对象提供一个委托对象数组。让它的 init 方法创建一个空数组multiDelegates

为管理 multiDelegate 数组的对象提供 addDelegate 方法和 removeDelegate 方法。事实上,创建一个定义这些方法的 MultiDelegateProtocol。

在 GameCenterFacade 中,当它通知客户端感兴趣的事件时,让它循环遍历它的 multiDelegate 数组并依次通知每个客户端。

或者,您可以使用发布/订阅模式或通知中心。

【讨论】:

以上是关于Swift 代表在 2 个地方设置单例的主要内容,如果未能解决你的问题,请参考以下文章

单例模式(singleton)

单例模式

C++设计模式:单例模式

Java 设计模式之单例学习与掌握

23种设计模式——单例模式对象性能

看完MJ讲解的单例后的个人总结