如何用CKModifyRecordsOperation.perRecordProgressBlock更新进度

这与MRProgress的最新线程更新进度有关 。 由于之前的线程,我将我的cloudkit查询从便捷API转换为CKOperations(谢谢Edwin!)。 所以在使用CKModifyRecordsOperation保存logging时,我可以通过loginperRecordProgressBlock来查看logging的进度,这非常棒。 但是,我试图把这个进度发回到viewcontroller,我不知道如何做到这一点。 我为我的所有CloudKit方法(CKManager)创build了一个类。 我遇到的另一个问题是,我不确定何时在VC中更新进度指示器(使用MRProgress框架)。 在CKManager的保存操作调用之前,期间或之后,我是否要调用它? 是否应该recursion调用,直到进度== 1.0? 这是我迄今的代码…除了更新/animation进度指示器(它出现并显示0%,然后在保存操作完成时消失)之外,每个工作都正常。 此外,我在我的CKManager类中使用属​​性(双重进展),我知道这是不正确的,但我不知道该怎么办。 我不觉得我已经在我的CKManager类声明/定义的callback方法是正确的。 任何指导表示赞赏!

CKManager.h

@property (nonatomic, readonly) double progress; - (void)recordProgressWithCompletionHandler:(void (^)(double progress))completionHandler; 

CKManager.m

  @property (nonatomic, readwrite) double progress; - (void)recordProgressWithCompletionHandler:(void (^)(double))completionHandler { completionHandler(self.progress); } - (void)saveRecord:(NSArray *)records withCompletionHandler:(void (^)(NSArray *, NSError *))completionHandler { NSLog(@"INFO: Entered saveRecord..."); CKModifyRecordsOperation *saveOperation = [[CKModifyRecordsOperation alloc] initWithRecordsToSave:records recordIDsToDelete:nil]; saveOperation.perRecordProgressBlock = ^(CKRecord *record, double progress) { if (progress <= 1) { NSLog(@"Save progress is: %f", progress); self.progress = progress; } }; saveOperation.perRecordCompletionBlock = ^(CKRecord *record, NSError *error) { NSLog(@"Save operation completed!"); completionHandler(@[record], error); }; [self.publicDatabase addOperation:saveOperation]; } 

Viewcontroller.m – 这是从摄像头拍照并调用CKManager类准备logging并保存到CK以及显示MRProgress指示器的方法…

 if (self.imageDataAddedFromCamera) { self.hud = [MRProgressOverlayView showOverlayAddedTo:self.myCollectionView animated:YES]; self.hud.mode = MRProgressOverlayViewModeDeterminateCircular; self.hud.titleLabelText = UPLOADING_MSG; // prepare the CKRecord and save it [self.ckManager saveRecord:@[[self.ckManager createCKRecordForImage:self.imageDataAddedFromCamera]] withCompletionHandler:^(NSArray *records, NSError *error) { if (!error && records) { NSLog(@"INFO: Size of records array returned: %lu", (unsigned long)[records count]); CKRecord *record = [records lastObject]; self.imageDataAddedFromCamera.recordID = record.recordID.recordName; NSLog(@"INFO: Record saved successfully for recordID: %@", self.imageDataAddedFromCamera.recordID); [self.hud dismiss:YES]; [self.hud removeFromSuperview]; [self.imageLoadManager addCIDForNewUserImage:self.imageDataAddedFromCamera]; // update the model with the new image // update number of items since array set has increased from new photo taken self.numberOfItemsInSection = [self.imageLoadManager.imageDataArray count]; [self updateUI]; } else { NSLog(@"Error trying to save the record!"); NSLog(@"ERROR: Error saving record to cloud...%@", error.localizedDescription); [self.hud dismiss:YES]; [self.hud removeFromSuperview]; [self alertWithTitle:YIKES_TITLE andMessage:ERROR_SAVING_PHOTO_MSG]; } }]; // where does this call belong? [self.ckManager recordProgressWithCompletionHandler:^(double progress) { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"Updating hud display..."); [self.hud setProgress:progress animated:YES]; }); }]; 

您应该像这样在saveRecord调用中包含进度处理程序:

 - (void)saveRecord:(NSArray *)records withCompletionHandler:(void (^)(NSArray *, NSError *))completionHandler recordProgressHandler:(void (^)(double))progressHandler { NSLog(@"INFO: Entered saveRecord..."); CKModifyRecordsOperation *saveOperation = [[CKModifyRecordsOperation alloc] initWithRecordsToSave:records recordIDsToDelete:nil]; saveOperation.perRecordProgressBlock = ^(CKRecord *record, double progress) { if (progress <= 1) { NSLog(@"Save progress is: %f", progress); progressHandler(progress) } }; saveOperation.perRecordCompletionBlock = ^(CKRecord *record, NSError *error) { NSLog(@"Save operation completed!"); completionHandler(@[record], error); }; [self.publicDatabase addOperation:saveOperation]; } 

那么你可以调用这样的保存logging:

  [self.ckManager saveRecord:@[[self.ckManager createCKRecordForImage:self.imageDataAddedFromCamera]] withCompletionHandler:^(NSArray *records, NSError *error) { if (!error && records) { NSLog(@"INFO: Size of records array returned: %lu", (unsigned long)[records count]); CKRecord *record = [records lastObject]; self.imageDataAddedFromCamera.recordID = record.recordID.recordName; NSLog(@"INFO: Record saved successfully for recordID: %@", self.imageDataAddedFromCamera.recordID); [self.hud dismiss:YES]; [self.hud removeFromSuperview]; [self.imageLoadManager addCIDForNewUserImage:self.imageDataAddedFromCamera]; // update the model with the new image // update number of items since array set has increased from new photo taken self.numberOfItemsInSection = [self.imageLoadManager.imageDataArray count]; [self updateUI]; } else { NSLog(@"Error trying to save the record!"); NSLog(@"ERROR: Error saving record to cloud...%@", error.localizedDescription); [self.hud dismiss:YES]; [self.hud removeFromSuperview]; [self alertWithTitle:YIKES_TITLE andMessage:ERROR_SAVING_PHOTO_MSG]; } }, recordProgressHandler:^(double progress) { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"Updating hud display..."); [self.hud setProgress:progress animated:YES]; }); }]; 

所以更新进度的代码是你的saveRecord调用的一部分。 上面的代码没有经过我的testing。 所以我希望我没有错字