2017-08-03 64 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單身人士必須註冊此類通知,並且當它收到一個通知時,它必須執行所需的功能。
這確實爲我工作。