gpt4 book ai didi

ios - 获取 AppleWatch 的 GooglePlaces API(以及一般的异步调用)数据(使用 WCSession)

转载 作者:行者123 更新时间:2023-11-30 13:04:29 24 4
gpt4 key购买 nike

所以 - 经过大量的游戏 - 我找到了一种让它发挥作用的方法,但我有一个东西我不知道如何绕过(并且让我发疯......)。

我有一个 watch 应用程序,需要来自 GooglePlaces 的数据(还没有适用于 iOS 的界面...)。因此 - 我使用 WCSession,并使用手机,使用 sendMessage 通过手机查询 GooglePlaces,将附近的地点返回到 watch 。

首先,GooglePlaces currentPlace 函数似乎是在调用它的同一线程上调用的(通过将其排队以供稍后使用)——这是一个问题,因为它被安排在程序运行之后已关闭(因为函数 didReceiveMessage 在调用之前就退出了)。因此,我没有在主队列上运行它,而是启动一个线程并在其上运行此代码......

它的一个问题是 replyHandler 必须在 session:didReceiveMessage 完成执行之前调用(否则,如果应用程序处于后台模式,进程将被终止)。

所以我为绕过这个问题而构建的代码看起来像这样(注意我在那里有一个嵌套的cloudKit代码..):

let queue = OperationQueue();

var finishedRunning = false;
queue.addOperation{
sleep(1);
self.placesClient?.currentPlace(callback: {
(placeLikelihoodList: GMSPlaceLikelihoodList?, error: Error?) -> () in
if let err = error {
retVal.removeAll();
retVal["error"] = err.localizedDescription;
finishedRunning = true;
return;
}

let predicate = NSPredicate(format: "selected = 1");
let query = CKQuery(recordType: "someInfo", predicate: predicate);

let privDb = CKContainer.default().privateCloudDatabase;
privDb.perform(query, inZoneWith: nil, completionHandler: {records, error in

if let err = error {
retVal.removeAll();
retVal["error"] = err.localizedDescription;
finishedRunning = true;
return;
}
retVal["completed"] = 1;
finishedRunning = true;
});
});
}

while !finishedRunning{
sleep(1);
}
marker = true;
replyHandler(retVal);

那些仔细阅读代码的人注意到我在开始队列后立即添加了一个 sleep(1); 命令。

我不清楚为什么,但是如果没有这个 sleep 调用,GooglePlaces 回调就不会被调用!!

我真的很想删除这个特定的调用..有人知道为什么会发生吗?如何绕过它?

(P.S.我不确定是否需要锁来保护finishedRunning..既然它有效,我认为没有必要)。

附注#2 - 我知道它很“脏”,但没有其他方法可以绕过它......因为我想要 watch 上的这些数据,所以我放弃了优雅......

谢谢!!

最佳答案

根据我的经验,在委托(delegate)方法返回之前不必调用 sendMessagereplayHandler ,但如果您确实希望维持该行为,则可以摆脱它至少其中一个 `sleep(1) 如下:

<...>
queue.waitUntilAllOperationsAreFinished()
marker = true;
replyHandler(retVal);

我对 GooglePlaces API 一无所知,所以我不知道为什么需要其他 sleep 。综上所述,因为我不相信必须在委托(delegate)方法返回之前调用 replayHandler 的基本假设,所以切换到更异步的方式来执行此任务可能会更好。

关于ios - 获取 AppleWatch 的 GooglePlaces API(以及一般的异步调用)数据(使用 WCSession),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39554408/

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