CLKComplicationServer初始化一个已经初始化的单例class CLKComplicationDataSource,虽然init()是私有的

CLKComplicationServer initializes an already initialized singleton class CLKComplicationDataSource, although init() is private

为了更新手表上的复杂功能,我使用了单例class ComplicationController(下面已省略无关代码):

final class ComplicationController: NSObject, CLKComplicationDataSource {

    static let shared = ComplicationController() // Instantiate the singleton

    private override init() {
        super.init()
        print("====self: \(self): init")
    } // Others can't init the singleton
}

单例由扩展委托在手表上创建:

class ExtensionDelegate: NSObject, WKExtensionDelegate {

  override init() {
    super.init()
        _ = ComplicationController.shared           
  }
}

当我在上面的打印语句处使用断点启动 watch 扩展时,执行中断并且堆栈跟踪为:

然后当我一步执行打印语句时,调试器显示:

====self: <Watch_Extension.ComplicationController: 0x7bf35f20>: init  

当我继续时,执行在同一个断点处再次中断,堆栈跟踪为:

又一步之后,调试器显示:

====self: <Watch_Extension.ComplicationController: 0x7d3211d0>: init  

显然,CLKComplicationServer 已经创建了另一个单例实例。

我的问题是:我是不是出了什么问题或者这是一个错误?如果它是一个错误,是否有解决方法?

PS: 初始化ExtensionDelegate中的ComplicationController无济于事。在这种情况下,只要在代码中的任何地方使用 ComplicationController.shared,就会创建第二个实例。

我找到了解决方法:

不要在应用程序中实例化单例,即不要在任何地方使用 ComplicationController.shared
如果您必须调用 ComplicationController.shared 中的函数,请发送通知,例如到默认通知中心。
ComplicationController 单例必须注册此类通知,并且当它收到一个通知时,它必须执行所需的功能。
这对我有用。