Почему мой CKQueryOperation возвращает Курсор, только если предел результатов меньше 1000? - PullRequest
0 голосов
/ 30 марта 2019

CloudKit содержит около 2000 записей, которые я пытаюсь загрузить. Я не могу загрузить их все, я посмотрел на CloudKit CKQueryOperation не получает все записи , чтобы получить более 100 результатов. Теперь я могу получить до 999 для загрузки, но если я установлю предел результатов на 1000 или больше, он будет случайным образом зависать между 80-500. Нужно ли разбивать эти записи на записи разных типов?

private func checkForCloudData() {
    let query = CKQuery(recordType: "myRecordType", predicate: .init(value: true))
    let op = CKQueryOperation(query: query)

    op.qualityOfService = .userInitiated
    op.queuePriority = .veryHigh
    op.resultsLimit = 999

    op.recordFetchedBlock = { record in
        // fetched record
    }

    op.queryCompletionBlock =  { cursor, err in

        if cursor != nil {
            print(cursor!)

            self.performOperation(withOperation: CKQueryOperation(cursor: cursor!))
        }

        if err == nil {
            // handle complete download
        } else {
            if (err as! CKError).code == .limitExceeded {
                if cursor != nil {
                    self.performOperation(withOperation: CKQueryOperation(cursor: cursor!))
                    return
                }
                let newOperation = CKQueryOperation(query: query)
                newOperation.resultsLimit = op.resultsLimit
                newOperation.queuePriority = .veryHigh
                newOperation.qualityOfService = .userInitiated
                newOperation.recordFetchedBlock = op.recordFetchedBlock
                newOperation.queryCompletionBlock = op.queryCompletionBlock

                self.performOperation(withOperation: newOperation)
            }
        }

    }

    self.performOperation(withOperation: op)
}

private func performOperation(withOperation operation: CKQueryOperation) {
        publicDB.add(operation)
}

1 Ответ

0 голосов
/ 08 апреля 2019

Я считаю, что 400 является пределом для одной операции, поэтому вам нужно использовать курсор, чтобы получить больше записей, и продолжать делать это, пока возвращаемый курсор не является nil.

Посмотрите, как это делается в библиотеке RxCloudKit 'RecordFetcher - https://github.com/maxvol/RxCloudKit/blob/master/RxCloudKit/RecordFetcher.swift

...