WatchConnectivity - 检测所有控制器中的应用程序上下文更改

时间:2015-10-23 19:37:03

标签: ios objective-c watchkit watchconnectivity

我正在尝试从iOS发送数据 - >观察,当活动控制器已实现didReceiveApplicationContext时,此工作正常。我可以收到上下文对象,一切运行良好。

但是,我不清楚如何在全球范围内实施didReceiveApplicationContext""因此,无论用户使用哪个控制器,Watch都会从iOS捕获上下文数据更改。我有几个用户可以浏览的控制器,所以当它们位于没有这种委托方法的控制器上时,不会捕获任何数据。

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

我假设在没有在每个Watch控制器中实现didReceiveApplicationContext的情况下实现这一目标?

由于

1 个答案:

答案 0 :(得分: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中实施ExtensionDelegate并在您的委托类中调用dataDidChange

extension ExtensionDelegate: WCSessionDelegate {
    func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
        SessionDelegate.sharedDelegate.dataDidChange(applicationContext)
    }
}