我写了一个非常基本的Xcode项目,其中包含3个目标: - iOS目标 - WatchKit应用程序 - WatchKit扩展
首先,我不明白为什么Xcode会为WatchKit app创建第二个目标(扩展名)?似乎WatchKit应用程序包含storyboard,而WatchKit扩展包含swift代码(控制器)。 Xcode是否有特殊原因设计和拆分2个目标而不是单个目标?
看看这段非常基本的代码:
iOS控制器:
override func viewDidLoad()
{
super.viewDidLoad()
if WCSession.isSupported()
{
let session = WCSession.default()
session.delegate = self
session.activate()
}
}
@IBAction func on_btn_tap(_ sender: Any)
{
if WCSession.isSupported()
{
let session = WCSession.default()
session.sendMessage(["mykey": "myvalue"], replyHandler: { (response) -> Void in
NSLog("OK")
}, errorHandler: { (error) -> Void in
NSLog("Error)
})
}
}
在观看扩展(InterfaceController.swift)上:
override func awake(withContext context: Any?)
{
super.awake(withContext: context)
if WCSession.isSupported()
{
let session = WCSession.default()
session.delegate = self
session.activate()
}
}
extension InterfaceController: WCSessionDelegate
{
func session(_ session: WCSession,
activationDidCompleteWith activationState: WCSessionActivationState,
error: Error?)
{
}
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void)
{
self.btn.setBackgroundColor(UIColor.yellow)
}
}
你当然明白,我的iOS应用程序上有一个按钮。当我点击此按钮时,我向观看应用程序发送消息,此应用程序将更改按钮颜色。
iPhone上的按钮点按和颜色变化之间有大约5-6秒的延迟。你知道为什么吗 ? 在另一个通信方面(注意iPhone),它是最糟糕的(10-15秒)
由于
答案 0 :(得分:0)
由于您要更新UI,因此需要将其包装在DispatchQueue中,如下所示:
DispatchQueue.main.async {
self.btn.setBackgroundColor(UIColor.yellow)
}
这些委托回调不在主线程上,并且您不应从主线程以外的任何其他线程更新UI。像这样包装起来可以更快地更新UI和更安全的代码。