Итак, после многих игр, я выяснил, как это сделать, но у меня есть одна вещь, которую я не понял как обойти (и сводит меня с ума ..).Получение общих данных API GooglePlaces (и асинхронных вызовов в целом) для AppleWatch (с использованием WCSession)
У меня есть приложение для часов, которым нужны данные из GooglePlaces (без интерфейса для iOS еще ...). Итак - я использую WCSession и использую телефон, используя sendMessage
, для запроса GooglePlaces по телефону, возвращая соседние места на часы.
Для начала, по-видимому 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);
вверх там ... сразу после начала очереди.
Непонятно, почему, но без этого вызова сна, обратный вызов GooglePlaces не вызывается!
Я бы очень хотел удалить этот звонок. Есть ли у кого-нибудь идеи, почему это происходит? Как обходить его?
(P.S. Я не уверен, что замки необходимы для защиты finishedRunning
.. так как это работает, я полагаю, что нет необходимости).
P.S. # 2 - Я знаю, что это «грязно», но нет другого способа обойти это ... так как я хочу эти данные на часах, я отказался от элегантности ...
Спасибо!
Это не соответствует моему опыту: _ «Проблема в том, что replyHandler должен быть вызван до сеанса: doneReceiveMessage заканчивается (иначе процесс будет убит, если приложение находится в фоновом режиме). _; на чем вы основываете это? – ccjensen
Отладка и другие сообщения здесь ... – evenro
Возможно, я ошибался, но это ведет себя странно, когда вызывается какой-либо асинхронный метод. – evenro