Выполнение CKQueryOperation с предикатом на основе CKReference, не возвращающее все "собственные записи"
Моя схема выглядит следующим образом
RecordType: OwnedEvents содержит элемент с именем "Владелец". Этот элемент Owner указывает на CKReference, созданный из RecordType типа "OwnedEvents".
У меня есть N объектов OwnedEvents, все они указывают на один объект Owner.
Когда я выполняю запрос для извлечения всех записей, которые указывают на данный объект Owner, я вижу, что в некоторых случаях запрос не возвращает все записи, которые указывают на него (он возвращает его в большинстве случаев). Это также не возвращает ошибку в блоке завершения. Когда я перехожу на панель мониторинга CloudKit, я вижу, что все объекты OwnedEvents указывают на один и тот же и правильный объект Owner, как и ожидалось. Код, который я использую, чтобы получить ниже.
Мои вопросы:
Ожидается ли такой "тихий" провал? Т.е. нужно ли это идентифицировать и восстановить? ИЛИ Что-то не так в моем запросе?
Можно ли сказать, что запрос должен вернуть ошибку, если не все записи, соответствующие критерию, получены? (то есть атомарная версия выборки. Думаю, нет, так как заранее сложно определить ожидаемое количество совпадающих записей, но мне интересно, есть ли что-то, что я могу указать в выборке или в схеме, которая намеки на минимальное количество записей, ожидаемых в результате выборки).
Является ли более эффективным выборка с использованием предиката, сформированного с использованием ссылки, по сравнению с выборкой, использующей предикат формы "Получить все записи типа OwnedEvents со столбцами X > N1 и столбцами X"
- Ссылка указана для того же набора записей, N1...N2
- Т.е. если поиск на основе ссылок будет ненадежным, я мог бы также отказаться от него и использовать метод грубой силы, если он не будет быстрее. По крайней мере, в последнем у меня есть простой способ выявления ошибок
Код используется
CKReference* recordToMatch = [[CKReference alloc] initWithRecordID:eventCollectionID
action:CKReferenceActionDeleteSelf]; //eventCollectionID is recordID of Record of type Owner
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"Owner == %@", recordToMatch];
// Create the query object.
CKQuery* query = [[CKQuery alloc] initWithRecordType:@"OwnedEvents" predicate:predicate];
CKQueryOperation *queryObject = [[CKQueryOperation alloc] initWithQuery:query] ;
queryObject.queryCompletionBlock = ^(CKQueryCursor * cursor, NSError * operationError) {
if(operationError)
{
DDLogError(@"Error %@ occured during query",operationError) ;
}
else if(cursor)
{
DDLogVerbose(@"Not all objects satisfying the query were returned. Need to get next batch") ;
//To do fetch remaining entries
CKQueryOperation *queryObject = [[CKQueryOperation alloc] initWithCursor:cursor] ;
//Execute another query with this object
}
else
{
DDLogVerbose(@"All objects satisfying the query were returned") ;
//Take appropriate action with rcvd data
}
} ;
queryObject.recordFetchedBlock = ^(CKRecord *record) {
DDLogVerbose(@"Received record with seq Num: %@, type",record[@"SequenceNumber"],record[@"EventType"]) ;
//Check if items are in sequence
} ;
[self.publicDatabase addOperation:queryObject] ;