Подтвердить что ты не робот

Списки подсчета CloudKit

У меня есть "таблица", которая потенциально может иметь много записей, при добавлении новой записи мне нужно знать, сколько записей уже есть в текущей таблице, поскольку я использую ее при вычислении некоторых значений. Самая близкая вещь, которую я мог найти, запрашивает все записи вроде этого:

var query : CKQuery = CKQuery(recordType: "Stars", predicate: NSPredicate(format: "mass > 0"))
    var request : CKQueryOperation = CKQueryOperation(query: query)
    var starCount = 0

    request.queryCompletionBlock = {
        (cursor:CKQueryCursor!, error:NSError!) in
        if error {
            completionHandler(ECOResponse.error(error.description), starCount)
        } else {
            completionHandler(ECOResponse.ok(), starCount)
        }
    }

    request.recordFetchedBlock = {
        (record:CKRecord!) in
        starCount += 1
    }

Я хочу, чтобы queryCompletionBlock дал массив count или results вместе с CKQueryCursor, но, к сожалению, этого не делает.

Есть ли другой способ вычисления числа строк в таблице?

4b9b3361

Ответ 1

Нет, невозможно получить общее количество записей, соответствующих вашему запросу. Кроме того, перечисляя результат, ответ может быть неправильным. Количество записей, возвращаемых CloudKit, не является фиксированным. CloudKit имеет механизм для определения количества возвращаемых записей. Можно установить это фиксированное число в объекте CKQueryOperation. По умолчанию:

operation.resultsLimit = CKQueryOperationMaximumResults;

В документах для этого свойства говорится:

При использовании этого значения сервер выбирает предел, который призван обеспечить оптимальное количество результатов, которое возвращает как можно больше записей, одновременно минимизируя задержки при получении этих записей. Однако, если вы знаете, что хотите обработать фиксированное количество результатов, измените значение этого свойства соответствующим образом.

Если ваш счет совпадает с этим фиксированным числом, то, вероятно, будет больше записей, чем ваш запрос.

Ответ 2

Невозможно получить общее количество записей, соответствующих запросу, не итеративным образом, но это можно сделать итеративно.

CKQueryOperation позволит вам получить все возможные результаты запроса, однако, потенциально только через несколько последующих операций: If the search yields many records, the operation object may deliver a portion of the total results to your blocks immediately, along with a cursor for obtaining the remaining records. source: CKQueryOperation Вы можете просто игнорировать все экземпляры CKRecord, возвращенные через CKQueryOperation recordFetchedBlock и просто увеличьте свой собственный счетчик NSUInteger. В моем тестировании общее количество вызовов recordFetchedBlock всегда соответствует ожидаемому количеству результатов запроса.

Также, для эффективности, вы можете использовать свойство desiredKeys CKQueryOperation для limit the amount of data retrieved for each record during the search operation. source: wantedKeys Комментарии внутри исходного файла CKQueryOperation.h указывают на то, что If set to an empty array, declares that no user fields should be downloaded.

Я протестировал сценарий выше с CKQueryOperation, успешно подсчитывающим сотни записей, таким образом, превышая установленный по умолчанию предел партии CKQueryOperationMaximumResults, равный 100.