【问题标题】:Using singleton WCSession delegate instead of instance methods使用单例 WCSession 委托而不是实例方法
【发布时间】:2015-11-06 17:18:54
【问题描述】:

我在使用 WatchOS 时遇到了一个奇怪的问题(但我认为这个问题与 iOS 和 OSX 类似)。

我正在使用单例来处理 WCSession 委托(完整代码由 NatashaTheRobot 提供,我在这里仅粘贴她的一部分代码,完整代码为 here )。 此类有一个 startSession 函数,其中单例关联为会话的委托:

func startSession() {
    session?.delegate = self
    session?.activateSession()
}

所有的委托函数都定义在同一个类中,比如session:didReceiveMessage:replyHandler:

我希望能够在 Watch 应用程序每次接收到当前 InterfaceController 独立的消息时调用委托。

我认为实现这个目标的好地方可能是ExtensionDelegate 类:

class ExtensionDelegate: NSObject, WKExtensionDelegate {

    let session = WatchSessionManager.sharedManager // THE SINGLETON INSTANCE

    func applicationDidFinishLaunching() {
        session.startSession()
    }

似乎这段代码不起作用,并且从未调用过委托函数。

然后我决定采用一种不太通用的方式,并开始在所有 InterfaceController 中添加对单例实例的引用......但它再次不起作用,并且从未调用过委托方法。 然后,在我的最后一次尝试中,我直接在 InterfaceController 代码中实现了会话委托协议。在那种情况下,我会收到来自 iOS 应用程序的消息……它工作正常(显然只有当手表应用程序呈现特定的 InterfaceController 时)。

我的问题是:为什么实现一个通用的单例对象不起作用?为什么我必须直接在 InterfaceController 上实现委托才能使其工作?

【问题讨论】:

    标签: watchkit watchos-2 watchconnectivity


    【解决方案1】:

    尝试将startSession 调用从ExtensionController 的applicationDidFinishLaunching 移至其init 方法。 init 无论为哪个上下文(复杂性、应用程序、glance、通知等)加载扩展程序,都会被调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 2014-04-17
      • 2023-03-23
      • 2011-04-14
      相关资源
      最近更新 更多