1

我的架构如下

RecordType:OwnedEvents 包含一个名为“Owner”的元素。此 Owner 元素指向从“OwnedEvents”类型的 RecordType 创建的 CKReference。

我有 N 个 OwnedEvents 对象都指向一个 Owner 对象。

当我执行查询以检索指向给定 Owner 对象的所有记录时,我发现在某些情况下,查询不会返回指向它的所有记录(在大多数情况下它确实返回它)。它也不会在完成块中返回错误。当我转到 CloudKit 仪表板时,我看到所有 OwnedEvents 对象都指向相同且正确的 Owner 对象,正如预期的那样。我用来检索的代码如下。

我的问题是:

  1. 这种“无声”的失败是意料之中的吗?即我需要识别并恢复吗?或者我在查询中做错了什么?

  2. 如果不是所有符合条件的记录都被检索到,有没有办法说查询必须返回错误?(即 fetch 的原子版本..我猜不是,因为很难提前知道预期的匹配记录数是多少,但我想知道是否可以在 fetch 或架构中指定一些内容提示获取结果中预期的最小记录数)。

  3. 与使用“获取列 X > N1 和列 X 的 OwnedEvents 类型的所有记录”形式的谓词相比,使用使用引用形成的谓词进行提取是否更有效

    • 引用指向同一组记录,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] ;
4

0 回答 0