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