2017-08-03 65 views
1

要在手表更新并发症,我使用一个单独的类ComplicationController(不相关的代码已被以下省略):CLKComplicationServer初始化已初始化的单例类CLKComplicationDataSource,虽然的init()是私有

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   
    } 
} 

当我在上面打印语句与断点推出手表扩展,执行休息和堆栈跟踪是:
enter image description here

当我再在一个单一的步骤执行打印语句,调试器显示:

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

当我再继续,执行同一断点再次打破,堆栈跟踪是:
enter image description here

后另一单个步骤中,调试器显示:

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

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

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

PS:它不帮而不是ExtensionDelegate中初始化ComplicationController。在这种情况下,只要在代码中的任何位置使用ComplicationController.shared,就会创建第二个实例。

+0

我做了一些测试,得到了相同的结果,创建了两个单例实例。然而,我在'ComplicatonController'的实例方法中,'func doSomething(){print(“Function called singleton”)打印'self'; print(self)}',即使我从ExtensionDelegate和InterfaceController调用这个函数两次,它都会为自己输出相同的内存地址。 –

回答

0

我找到了一个解决办法:

不要实例化单的应用程序,即不使用ComplicationController.shared任何地方。
如果您必须拨打ComplicationController.shared中的功能,请发送通知(例如,到默认通知中心。
ComplicationController单身人士必须注册此类通知,并且当它收到一个通知时,它必须执行所需的功能。
这确实为我工作。