Я получаю базу данных CloudKit с помощью CKQueryOperation. Почему-то каждый раз, когда я нажимаю кнопку выборки, в первый раз я получаю нулевой курсор. Во второй раз он получает и получает данные, все хорошо. Когда я проверяю recordFetchedBlock , он получает результаты и добавляет их, но в конце массив становится пустым. Я не понимаю, почему это происходит. Я хочу показать результаты немедленно, так как они были получены. Я думаю, что проблема с нулевым курсором, но я открыт для других предложений. Вот мой код:
public class CloudKitDatabase {
static let shared = CloudKitDatabase()
var records = [CKRecord]()
let publicData = CKContainer.default().publicCloudDatabase
init() {
self.fetchRecords()
}
func fetchRecords() {
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "OECD", predicate: predicate)
let queryOperation = CKQueryOperation(query: query)
queryOperation.recordFetchedBlock = {
record in
self.records.append(record)
}
queryOperation.queryCompletionBlock = { cursor, error in
DispatchQueue.main.async {
if error != nil {
print(error.debugDescription)
} else {
if cursor != nil {
self.queryServer(cursor!)
} else {
print("CURSOR IS NIL")
}
}
}
}
self.publicData.add(queryOperation)
}
func queryServer(_ cursor: CKQueryOperation.Cursor) {
let queryOperation = CKQueryOperation(cursor: cursor)
queryOperation.recordFetchedBlock = {
record in
self.records.append(record)
}
queryOperation.queryCompletionBlock = { cursor, error in
DispatchQueue.main.async {
if error != nil {
print(error.debugDescription)
} else {
if cursor != nil {
self.queryServer(cursor!)
} else {
print("CURSOR IS NIL")
}
}
}
}
self.publicData.add(queryOperation)
}
Область отладки говорит мне, что: CURSOR IS NIL и CloudKitDatabase.shared.records.isEmpty true