CKFetchRecordsOperation + CKQueryOperations ...我错过了什么?

use*_*232 3 objective-c nsoperation ios cloudkit ckrecord

在大量搜索示例代码之后,管理好一起CKFetchRecordsOperation; 这是......但我一定错过了什么.不要误会我的意思......但......

要执行CKFetchRecordsOperation,您需要一个CKRecordIDs的NSArray; 要获得CKRecordIDs的NSArray,您需要执行CKQuery,您可以构建CKRecordIDs的NSArray.

但是等一下,提取CKRecordIDs的过程使用CKQuery,我可以直接下载CKRecords吗?

如果没有CKQuery,你如何获得CKRecordID的NSArray?

-(void)doSingleBeaconsDownload
{
    CKDatabase *publicDatabase = [[CKContainer containerWithIdentifier:@"iCloud.cqd.ch.BeaconBrowser"] publicCloudDatabase];
    NSPredicate *predicatex = [NSPredicate predicateWithFormat:@"iBeaconConfig = %@",iBeaconsConfirmed.giReferenceID];
    CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Running" predicate:predicatex];

    [self.delegate performSelectorOnMainThread:@selector(processCompleted:) withObject:@"Downloading Configuration ..." waitUntilDone:YES];

    [publicDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) {

        if (error) {
            NSLog(@"Batch Download Error iCloud error %@",error);
        }
        else {
            NSMutableArray *rex2download = [[NSMutableArray alloc] init];
            for (CKRecord *rex in results) {
                [rex2download addObject:rex.recordID];
            }

            CKFetchRecordsOperation *fetchRecordsOperation = [[CKFetchRecordsOperation alloc] initWithRecordIDs:rex2download];

           /* fetchRecordsOperation.perRecordCompletionBlock = ^(CKRecord *record, CKRecordID *recordID, NSError *error) {
                if (error) {
                    // Retain the record IDs for failed fetches
                }
                else {
                   // Do something with each record downloaded
                }
            };*/

            fetchRecordsOperation.perRecordProgressBlock = ^(CKRecordID *record, double recordsDownloaded) {
                if (error) {
                    // damn ...
                } else {
                    NSLog(@"Downloaded %f", recordsDownloaded);
                }
            };
            fetchRecordsOperation.fetchRecordsCompletionBlock = ^(NSDictionary *recordsByRecordID, NSError *error) {
                if (error) {
                    // Failed to fetch all or some of the records
                }
                else {
                    for(CKRecord *record in results) {
                        NSLog(@"Fini download %lu",(unsigned long)[recordsByRecordID count]);
                    }
                    [self.delegate performSelectorOnMainThread:@selector(beaconsDownloaded:) withObject:noOf waitUntilDone:YES];
                }
            };
            [publicDatabase addOperation:fetchRecordsOperation];
        }
    }];
}
Run Code Online (Sandbox Code Playgroud)

har*_*orn 9

从Apple 文档:CKFetchRecordsOperation对象从iCloud中检索CKRecord对象(您已知道的ID).

CKQueryOperation用于根据某些Query从iCloud中检索CKRecords,因此即使您不知道它们的recordID也可以获取它们.只有拥有CKRecordID时才使用CKFetchRecordsOperation.您可以在不访问iCloud的情况下创建CKRecordID,并且可以将它们存储在您拥有的任何本地存储中.

我用于此类操作的一个好用例是,当您想要修改CKRecord时,需要先从iCloud中检索它(使用CKFetchRecordsOperation),然后使用CKModifyRecordsOperation将其保存回来.

看看CloudKit上的两个WWDC 2014视频,可以很好地解释这一点.