WatchConnectivity - 检测所有控制器中的应用程序上下文更改
WatchConnectivity - detect Application Context change in all controllers
我正在尝试从 iOS -> Watch 发送数据,当活动控制器已实施 didReceiveApplicationContext
时,这工作正常。我可以接收上下文对象并且一切正常。
但是,我不清楚如何实现 didReceiveApplicationContext
"globally",以便 Watch 捕获来自 iOS 的上下文数据更改,而不管用户使用的是哪个控制器。我有几个用户可以在其中导航的控制器,因此当它们位于没有此委托方法的控制器上时,不会捕获任何数据。
我尝试将此委托方法添加到 ExtensionDelegate.m
以尝试全局捕获来自 iOS 的数据,但当我尝试输出到日志时它似乎没有捕获任何内容.
我假设有一种方法可以实现这一点,而无需在每个 Watch 控制器中实现 didReceiveApplicationContext
?
谢谢
您可以创建一个委托 class 来侦听新数据,然后将新数据通知所有感兴趣的接口控制器。如果你有多个接口控制器需要在新数据到达时更新,你可以将这个委托实现为单例,以便能够从你的扩展的任何部分添加观察者(就像 Apple 对其 NSNotificationCenter class 所做的那样):
class SessionDelegate {
static let sharedDelegate = SessionDelegate()
private override init() {}
....
}
定义所有感兴趣的接口控制器都可以实现的观察者协议:
protocol DataObserver {
func dataDidChange(data: AnyObject)
}
向您的委托添加一个观察者数组 class 以及添加和删除观察者的两种方法:
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
class都可以将自己添加为观察者:
SessionDelegate.sharedDelegate.addObserver(self)
并实现协议中的方法:
func dataDidChange(data: AnyObject) {
// update UI
}
最后,您必须通知您的委托 class 新数据已到达,以便它可以通知其观察者。因此,在您的 ExtensionDelegate
中实施 didReceiveApplicationContext
并在您的代表 class:
上调用 dataDidChange
extension ExtensionDelegate: WCSessionDelegate {
func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
SessionDelegate.sharedDelegate.dataDidChange(applicationContext)
}
}
我正在尝试从 iOS -> Watch 发送数据,当活动控制器已实施 didReceiveApplicationContext
时,这工作正常。我可以接收上下文对象并且一切正常。
但是,我不清楚如何实现 didReceiveApplicationContext
"globally",以便 Watch 捕获来自 iOS 的上下文数据更改,而不管用户使用的是哪个控制器。我有几个用户可以在其中导航的控制器,因此当它们位于没有此委托方法的控制器上时,不会捕获任何数据。
我尝试将此委托方法添加到 ExtensionDelegate.m
以尝试全局捕获来自 iOS 的数据,但当我尝试输出到日志时它似乎没有捕获任何内容.
我假设有一种方法可以实现这一点,而无需在每个 Watch 控制器中实现 didReceiveApplicationContext
?
谢谢
您可以创建一个委托 class 来侦听新数据,然后将新数据通知所有感兴趣的接口控制器。如果你有多个接口控制器需要在新数据到达时更新,你可以将这个委托实现为单例,以便能够从你的扩展的任何部分添加观察者(就像 Apple 对其 NSNotificationCenter class 所做的那样):
class SessionDelegate {
static let sharedDelegate = SessionDelegate()
private override init() {}
....
}
定义所有感兴趣的接口控制器都可以实现的观察者协议:
protocol DataObserver {
func dataDidChange(data: AnyObject)
}
向您的委托添加一个观察者数组 class 以及添加和删除观察者的两种方法:
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
class都可以将自己添加为观察者:
SessionDelegate.sharedDelegate.addObserver(self)
并实现协议中的方法:
func dataDidChange(data: AnyObject) {
// update UI
}
最后,您必须通知您的委托 class 新数据已到达,以便它可以通知其观察者。因此,在您的 ExtensionDelegate
中实施 didReceiveApplicationContext
并在您的代表 class:
dataDidChange
extension ExtensionDelegate: WCSessionDelegate {
func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
SessionDelegate.sharedDelegate.dataDidChange(applicationContext)
}
}