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)
从Apple 文档:CKFetchRecordsOperation对象从iCloud中检索CKRecord对象(您已知道的ID).
CKQueryOperation用于根据某些Query从iCloud中检索CKRecords,因此即使您不知道它们的recordID也可以获取它们.只有拥有CKRecordID时才使用CKFetchRecordsOperation.您可以在不访问iCloud的情况下创建CKRecordID,并且可以将它们存储在您拥有的任何本地存储中.
我用于此类操作的一个好用例是,当您想要修改CKRecord时,需要先从iCloud中检索它(使用CKFetchRecordsOperation),然后使用CKModifyRecordsOperation将其保存回来.
看看CloudKit上的两个WWDC 2014视频,可以很好地解释这一点.