我正在尝试从iOS发送数据 - >观察,当活动控制器已实现didReceiveApplicationContext
时,此工作正常。我可以收到上下文对象,一切运行良好。
但是,我不清楚如何在全球范围内实施didReceiveApplicationContext
""因此,无论用户使用哪个控制器,Watch都会从iOS捕获上下文数据更改。我有几个用户可以浏览的控制器,所以当它们位于没有这种委托方法的控制器上时,不会捕获任何数据。
我尝试将此委托方法添加到ExtensionDelegate.m
以尝试捕获来自iOS全局的数据,但在我尝试输出到日志时它似乎无法捕获任何内容。< / p>
我假设在没有在每个Watch控制器中实现didReceiveApplicationContext
的情况下实现这一目标?
由于
答案 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)
}
}