gpt4 book ai didi

swift - 等待 openParentApplication 回调完成

转载 作者:行者123 更新时间:2023-11-28 09:12:15 26 4
gpt4 key购买 nike

我的 watch 应用程序使用 openParentApplication 从其 WatchKit 扩展请求数据。它从 watch 应用程序的主页 init() 开始:

class HomePage : WKInterfaceController {
@IBOutlet weak var table: WKInterfaceTable!

override init() {
super.init()
NSLog("Starting home page.")

Fetcher.GetData() // Get data from WatchKit extension

NSLog("Got data!")
// Create table rows using GetData() return values
self.table.setRowTypes(rowTypes)
// etc...
}

}

class Fetcher : NSObject {
// Request data from WatchKit extension:
class func GetData() {
NSLog("GetData() begins.")
WKInterfaceController.openParentApplication(
["command" : "sendData"],
reply: {
(returnedValues, error) -> Void in
GotData(returnedValues, error)
}
)
NSLog("GetData() ends.")
}

// Callback for openParentApplication in GetData():
class func GotData(dict: [String:AnyObject]?, error: NSError?) {
NSLog("GotData() starts.")
if error != nil {
NSLog("Error in GotData(): %@", error!.debugDescription)
}
NSLog("GotData() processing...")

// use the data returned in dict...

NSLog("GotData() done.")
}

}

该扩展程序会填充适当的字典并在返回前调用 reply()。准备和返回数据需要一秒钟左右的时间。

问题来了:有时有效,有时无效。有时主页会完美地接收数据。有时不会调用回调 GotData()。当它正常工作时:

21:00:46.151 WatchKit Extension: Starting home page.
21:00:46.171 WatchKit Extension: GetData() begins.
21:00:46.180 WatchKit Extension: GotData() starts.
21:00:47.175 WatchKit Extension: GotData() done.
21:00:47.177 WatchKit Extension: GetData() ends.
21:00:47.188 WatchKit Extension: Got data!

如果没有:

21:00:46.151 WatchKit Extension: Starting home page.
21:00:46.171 WatchKit Extension: GetData() begins.
21:00:46.177 WatchKit Extension: GetData() ends.
21:00:46.188 WatchKit Extension: Got data!

我发现:如果主页在 willActivate() 中执行操作,则 GotData() 回调永远不会运行。然而,这并不是唯一的失败案例。

如何确保回调实际执行?我怀疑 dispatch_groups 至少是答案的一部分,但我不知道如何正确地将它们组合在一起。

非常感谢您的帮助。

最佳答案

一旦 GotData 方法处理完回复,您就需要更新您的表格。 Fetcher.GetData() 调用是异步的,不会阻塞。因此,init 函数其余部分的代码需要移到回调(或闭包)中。这是正确处理异步行为的逻辑的修改版本。

class HomePage : WKInterfaceController {
@IBOutlet weak var table: WKInterfaceTable!

override init() {
super.init()
NSLog("Starting home page.")

Fetcher.GetData { dataValues in
NSLog("Got data!")
// Create table rows using GetData() return values
self.table.setRowTypes(rowTypes)
// etc...
}
}
}

class Fetcher : NSObject {
// Request data from WatchKit extension:
class func GetData(completionHandler: ([String: String]) -> Void) {
NSLog("GetData() begins.")
WKInterfaceController.openParentApplication(
["command" : "sendData"],
reply: {
(returnedValues, error) -> Void in
GotData(returnedValues, error)
}
)
NSLog("GetData() ends.")
}

// Callback for openParentApplication in GetData():
class func GotData(dict: [String:AnyObject]?, error: NSError?, completionHandler: ([String: String]) -> Void) {
NSLog("GotData() starts.")
if error != nil {
NSLog("Error in GotData(): %@", error!.debugDescription)
}
NSLog("GotData() processing...")

// use the data returned in dict...

let data = ["someKey": "someValue"]

completionHandler(data)

NSLog("GotData() done.")
}
}

希望这能让您朝着正确的方向前进。

关于swift - 等待 openParentApplication 回调完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28923382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com