#swift #async-await #cloudkit
Вопрос:
Я использую async/await с CloudKit, и я хочу запросить элементы. Поэтому я написал следующее:
private func getItems() async throws -> [Item] {
// let predicate = NSPredicate(value: true)
let predicate = NSPredicate(format: "id != %@", "blah")
let sort = NSSortDescriptor(key: "creationDate", ascending: false)
let query = CKQuery(recordType: "Item", predicate: predicate)
query.sortDescriptors = [sort]
print("Let's go!")
let items: [Item] = await withCheckedContinuation { continuation in
let op = CKQueryOperation(query: query)
op.recordMatchedBlock = { (recordId, result) in
print("recordMatchedBlock")
}
op.queryResultBlock = { result in
print("queryCompletionBlock: Jobs done!")
continuation.resume(returning: [])
}
db.add(op)
}
print("All done!")
return items
}
Если бы я использовал предикат true, это дало бы мне сбой в имени записи (поле, которого у меня нет в элементе), отсутствовало, следовательно, другой предикат.
В любом случае, это красиво печатает «Поехали!», печатает «recordMatchedBlock» для каждого элемента, а затем «Работа выполнена!». В этот момент продолжение должно возобновиться, и элементы должны получить значение []. Но «Все сделано!» никогда не печатается.
Почему «Все сделано!» никогда не печатается? Почему продолжение не заставляет ожидание продолжаться?
Ответ №1:
В примечаниях к выпуску Xcode13b2 говорится:
API-интерфейсы асинхронных задач в macOS, watchOS и tvOS отличаются от API-интерфейсов асинхронных задач в iOS. В результате вызовы API задач для объектов-участников в многоплатформенных проектах могут привести к зависанию асинхронных функций в точке приостановки. (79378627)
Вот и все! Это идеально соответствовало всем требованиям. Так что пока я буду продолжать разрабатывать это на iOS и ожидать, что проблема будет устранена.