0

我正在尝试从 iOS -> Watch 发送数据,当活动控制器didReceiveApplicationContext实现时,这工作正常。我可以接收上下文对象并且一切正常。

但是,我不清楚如何didReceiveApplicationContext“全局”实现,以便 Watch 捕获来自 iOS 的上下文数据更改,而不管用户在哪个控制器上。我有几个用户可以导航的控制器,因此当它们位于没有此委托方法的控制器上时,不会捕获任何数据。

我尝试将此委托方法添加到ExtensionDelegate.m以尝试全局捕获来自 iOS 的数据,但是当我尝试输出到日志时它似乎没有捕获任何内容。

我假设有一种方法可以实现这一点,而无需didReceiveApplicationContext在每个 Watch 控制器中实现?

谢谢

4

1 回答 1

3

您可以创建一个委托类来侦听新数据,然后通知所有感兴趣的接口控制器有关新数据的信息。如果您有多个接口控制器需要在新数据到达时更新,您可以将此委托实现为单例,以便能够从扩展的任何部分添加观察者(就像 Apple 使用其 NSNotificationCenter 类所做的那样):

class SessionDelegate {
    static let sharedDelegate = SessionDelegate()
    private override init() {}
    ....
}

定义一个所有感兴趣的接口控制器都可以实现的观察者协议:

protocol DataObserver {
    func dataDidChange(data: AnyObject)
}

向您的委托类添加一个观察者数组以及添加和删除观察者的两种方法:

private var observers = [DataObserver]()

func addObserver(observer: DataObserver) {
   // add the observer to observers
}

func removeObserver(observer: DataObserver) {
   // remove the observer from observers
}

当您收到新数据时,通过观察者迭代并调用协议中定义的方法:

func didReceiveData(data: AnyObject) {
    for observer in observers {
        observer.dataDidChange(data)
    }
}

现在所有WKInterfaceController需要刷新的类都可以将自己添加为观察者:

SessionDelegate.sharedDelegate.addObserver(self)

并实现协议中的方法:

func dataDidChange(data: AnyObject) {
    // update UI
}

最后,您必须通知您的委托类新数据已到达,以便它可以通知其观察者。因此,在您的委托类中实现didReceiveApplicationContext并调用ExtensionDelegatedataDidChange

extension ExtensionDelegate: WCSessionDelegate {
    func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
        SessionDelegate.sharedDelegate.dataDidChange(applicationContext)
    }
}
于 2015-10-23T19:56:38.717 回答