Быстрое продолжение не заставляет ждать продолжения

#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 и ожидать, что проблема будет устранена.