如何使用CKModifyRecordsOperation.perRecordProgressBlock更新进度

桑尼

与MRProgress最近的线程更新进度有关由于先前的线程(感谢Edwin!),我将Cloudkit查询从便捷API转换为CKOperations。因此,在使用CKModifyRecordsOperation保存记录时,我可以通过登录perRecordProgressBlock来查看记录的进度,这很棒。但是,我试图将此进度发送回视图控制器,我不知道如何做到这一点。我为我的所有CloudKit方法创建了一个类-CKManager。我遇到的另一个问题是我不确定何时在VC中更新进度指示器(使用MRProgress框架)。是否在CKManager中调用保存操作之前,期间或之后调用它?是否应该递归调用它,直到进度== 1.0?这是我到目前为止的代码... 除更新/设置进度指示器动画外,其他所有方法都可以正常工作(显示并显示0%,然后在保存操作完成时消失)。另外,我在CKManager类中使用了一个属性(双重进度),我知道这是不正确的,但是我不确定其他方法。我也不认为我在下面的CKManager类中声明/定义的回调方法是正确的。任何指导表示赞赏!

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类以准备记录并将其保存到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];
                });
            }];
埃德温·维米尔(Edwin Vermeer)

您应该像这样在您的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];
}

然后,您可以像这样调用该保存记录:

        [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调用的一部分。上面的代码未经我测试。所以我希望我没有打错字

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用CKModifyRecordsOperation.perRecordProgressBlock更新进度

来自分类Dev

如何循环更新进度条?

来自分类Dev

如何逐步更新进度栏?

来自分类Dev

使用 javascript 更新进度条

来自分类Dev

进度条使用样式更新进度

来自分类Dev

如何从同时运行的任务更新进度条

来自分类Dev

完成反应后如何更新进度和执行代码

来自分类Dev

如何在长循环中更新进度栏?

来自分类Dev

如何从SwingWorker中的方法更新进度栏

来自分类Dev

使用ajax请求秒更新进度条

来自分类Dev

使用Firebase上传更新进度条

来自分类Dev

使用NSFileManager在复制文件期间更新进度栏

来自分类Dev

使用TPL异步更新进度条

来自分类Dev

使用复选框更新进度条:jQuery

来自分类Dev

使用Firebase上传更新进度条

来自分类Dev

如何通过CKModifyRecordsOperation更新CKRecord?

来自分类Dev

更新面板,确认按钮和更新进度似乎无法一起使用

来自分类Dev

如何在Android中每5秒更新进度对话框文本?

来自分类Dev

如何在闪亮的多个模块和应用程序中更新进度条?

来自分类Dev

如何在Android中每5秒更新进度对话框文本?

来自分类Dev

如何在所有控件之上显示更新进度控件

来自分类Dev

如何在QT中更新进度条时更改选项卡

来自分类Dev

使用VBScript的HTA冻结,并且在文件传输完成之前不会更新进度状态

来自分类Dev

使用百分比值更新进度栏?

来自分类Dev

Android-使用其他线程的值更新进度栏

来自分类Dev

如何更新进度条以显示活动期间的进度(一种方法有效时)?

来自分类Dev

如何在异步更新进度的同时将 blob 流成功复制到文件或文件流。?

来自分类Dev

在-[AVPlayerPeriodicCaller initWithPlayer:interval:queue:block:]中使用断言失败更新进度滑块时,AVPlayer导致崩溃

来自分类Dev

如何在 python 2 tkinter 中显示当前任务的运行状态并更新进度条而不会同时冻结?

Related 相关文章

  1. 1

    如何使用CKModifyRecordsOperation.perRecordProgressBlock更新进度

  2. 2

    如何循环更新进度条?

  3. 3

    如何逐步更新进度栏?

  4. 4

    使用 javascript 更新进度条

  5. 5

    进度条使用样式更新进度

  6. 6

    如何从同时运行的任务更新进度条

  7. 7

    完成反应后如何更新进度和执行代码

  8. 8

    如何在长循环中更新进度栏?

  9. 9

    如何从SwingWorker中的方法更新进度栏

  10. 10

    使用ajax请求秒更新进度条

  11. 11

    使用Firebase上传更新进度条

  12. 12

    使用NSFileManager在复制文件期间更新进度栏

  13. 13

    使用TPL异步更新进度条

  14. 14

    使用复选框更新进度条:jQuery

  15. 15

    使用Firebase上传更新进度条

  16. 16

    如何通过CKModifyRecordsOperation更新CKRecord?

  17. 17

    更新面板,确认按钮和更新进度似乎无法一起使用

  18. 18

    如何在Android中每5秒更新进度对话框文本?

  19. 19

    如何在闪亮的多个模块和应用程序中更新进度条?

  20. 20

    如何在Android中每5秒更新进度对话框文本?

  21. 21

    如何在所有控件之上显示更新进度控件

  22. 22

    如何在QT中更新进度条时更改选项卡

  23. 23

    使用VBScript的HTA冻结,并且在文件传输完成之前不会更新进度状态

  24. 24

    使用百分比值更新进度栏?

  25. 25

    Android-使用其他线程的值更新进度栏

  26. 26

    如何更新进度条以显示活动期间的进度(一种方法有效时)?

  27. 27

    如何在异步更新进度的同时将 blob 流成功复制到文件或文件流。?

  28. 28

    在-[AVPlayerPeriodicCaller initWithPlayer:interval:queue:block:]中使用断言失败更新进度滑块时,AVPlayer导致崩溃

  29. 29

    如何在 python 2 tkinter 中显示当前任务的运行状态并更新进度条而不会同时冻结?

热门标签

归档