Как использовать CloudKit для итеративного запроса с CKQueryOperation, пока курсор не станет равным нулю?
Как бы я объявил замыкание, которое извлекает записи из CloudKit, итеративно вызывает себя, пока все записи не будут извлечены? Следующий код делает это, за исключением того, что я получаю сообщение об ошибке
Переменная, используемая в пределах своего начального значения
в строке, где я присваиваю свойство queryCompletionBlock замыкания свойству с тем же именем операции запроса в объявлении самого замыкания. По сути, я получаю сообщение об ошибке, потому что я вызываю замыкание внутри себя в объявлении замыкания до объявления замыкания.
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: DatabaseNameStrings.recordTypeEntry, predicate: predicate)
let queryOperation = CKQueryOperation(query: query)
queryOperation.desiredKeys = [DatabaseNameStrings.fieldNameCreatedAt, DatabaseNameStrings.fieldNameText]
let queryCompletionBlock = {
(cursor: CKQueryOperation.Cursor?, error: Error?) in
if let error = error {
print(error.localizedDescription)
} else if let cursor = cursor {
let queryOperation = CKQueryOperation(cursor: cursor)
queryOperation.desiredKeys = [DatabaseNameStrings.fieldNameCreatedAt, DatabaseNameStrings.fieldNameText]
queryOperation.queryCompletionBlock = queryCompletionBlock // Error message "Variable used within its own initial value"
queryOperationQueue.addOperation(queryOperation)
}
}
queryOperation.queryCompletionBlock = queryCompletionBlock
queryOperationQueue.addOperation(queryOperation)
1 ответ
Решение
Один из вариантов, который должен работать, это ссылаться на queryCompletionBlock
исходной операции запроса.
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: DatabaseNameStrings.recordTypeEntry, predicate: predicate)
let queryOperation = CKQueryOperation(query: query)
queryOperation.desiredKeys = [DatabaseNameStrings.fieldNameCreatedAt, DatabaseNameStrings.fieldNameText]
let queryCompletionBlock = {
(cursor: CKQueryOperation.Cursor?, error: Error?) in
if let error = error {
print(error.localizedDescription)
} else if let cursor = cursor {
let newOperation = CKQueryOperation(cursor: cursor)
newOperation.desiredKeys = queryOperation.desiredKeys
newOperation.queryCompletionBlock = queryOperation.queryCompletionBlock
newOperationQueue.addOperation(newOperation)
}
}
queryOperation.queryCompletionBlock = queryCompletionBlock
queryOperationQueue.addOperation(queryOperation)