CKQueryOperation queryCompletionBlock возвращает нулевой курсор - PullRequest
0 голосов
/ 19 апреля 2020

Я получаю базу данных 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

1 Ответ

0 голосов
/ 20 апреля 2020

Сначала попробуйте несколько конфигов по первому запросу;

   let queryOperation = CKQueryOperation(query: query)
   queryOperation.queuePriority = .veryHigh
   queryOperation.resultsLimit = 99 // built in limit is 400  

Далее, не выполняйте вызовы курсора в диспетчере и не включайте ваши завершения;

queryOperation.queryCompletionBlock =
{ cursor, error in

        if error != nil {
            print(error.debugDescription)
        } else {
            if cursor != nil {
                self.queryServer(cursor!)
            } else {
                print("CURSOR IS NIL")
                completion(nil)
            }
        }
}

и;

queryOperation.queryCompletionBlock = 
{ cursor, error in

        if error != nil {
            print(error.debugDescription)
        } else {
            if cursor != nil {
                self.queryServer(cursor!)
            } else {
                print("CURSOR IS NIL")
                completion(nil)
            }
        }

}

также не забудьте очистить массив записей в начале fetchRecords, иначе последовательные вызовы получат те же записи в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...