Как использовать CloudKit для итеративного запроса с CKQueryOperation, пока курсор не станет равным нулю? - PullRequest
0 голосов
/ 07 декабря 2018

Как мне объявить замыкание, которое извлекает записи из 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 Ответ

0 голосов
/ 07 декабря 2018

Один из вариантов, который должен работать, - ссылаться на 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)
...