菜鸟教程小白 发表于 2022-12-13 06:15:14

ios - 如何使用 CKModifyRecordsOperation.perRecordProgressBlock 更新进度


                                            <p><p>这与最近的一个线程有关 <a href="https://stackoverflow.com/questions/29376714/update-progress-with-mrprogress/29377337#29377337" rel="noreferrer noopener nofollow">Update progress with MRProgress</a> .由于之前的线程(感谢 Edwin!),我将我的 cloudkit 查询从便捷 API 转换为 CKOOperations。因此,在使用 CKModifyRecordsOperation 保存记录时,我可以通过登录 perRecordProgressBlock 来查看记录的进度,非常棒。但是,我正在尝试将此进度发送回 ViewController ,但我无法弄清楚如何做到这一点。我为我的所有 CloudKit 方法创建了一个类 - CKManager。我遇到的另一个问题是我不确定何时更新 VC 中的进度指示器(使用 MRProgress 框架)。我是在 CKManager 中的保存操作调用之前、期间还是之后调用它?是否应该递归调用直到进度== 1.0?这是我到目前为止的代码......除了更新/动画进度指示器(它出现并显示 0%,然后在保存操作完成后消失)之外,一切都很好。另外,我在我的 CKManager 类中使用了一个属性(双进度),我知道这是不正确的,但我不知道该怎么做。而且我认为我在下面的 CKManager 类中为此声明/定义的回调方法也不正确。任何指导表示赞赏!</p>

<p>CKManager.h</p>

<pre><code>@property (nonatomic, readonly) double progress;
- (void)recordProgressWithCompletionHandler:(void (^)(double progress))completionHandler;
</code></pre>

<p>CKManager.m</p>

<pre><code>    @property (nonatomic, readwrite) double progress;
    - (void)recordProgressWithCompletionHandler:(void (^)(double))completionHandler {

    completionHandler(self.progress);
}

- (void)saveRecord:(NSArray *)records withCompletionHandler:(void (^)(NSArray *, NSError *))completionHandler {

    NSLog(@&#34;INFO: Entered saveRecord...&#34;);
    CKModifyRecordsOperation *saveOperation = [ initWithRecordsToSave:records recordIDsToDelete:nil];

    saveOperation.perRecordProgressBlock = ^(CKRecord *record, double progress) {
      if (progress &lt;= 1) {
            NSLog(@&#34;Save progress is: %f&#34;, progress);
            self.progress = progress;
      }
    };

    saveOperation.perRecordCompletionBlock = ^(CKRecord *record, NSError *error) {
      NSLog(@&#34;Save operation completed!&#34;);
      completionHandler(@, error);
    };

    ;
}
</code></pre>

<p>Viewcontroller.m - 这是从相机获取照片并调用 CKManager 类以准备记录并将其保存到 CK 以及显示 MRProgress 指示器的方法...</p>

<pre><code>if (self.imageDataAddedFromCamera) {
            self.hud = ;
            self.hud.mode = MRProgressOverlayViewModeDeterminateCircular;
            self.hud.titleLabelText = UPLOADING_MSG;
            // prepare the CKRecord and save it
            ] withCompletionHandler:^(NSArray *records, NSError *error) {
                if (!error &amp;&amp; records) {
                  NSLog(@&#34;INFO: Size of records array returned: %lu&#34;, (unsigned long));
                  CKRecord *record = ;
                  self.imageDataAddedFromCamera.recordID = record.recordID.recordName;
                  NSLog(@&#34;INFO: Record saved successfully for recordID: %@&#34;, self.imageDataAddedFromCamera.recordID);
                  ;
                  ;
                  ; // update the model with the new image
                  // update number of items since array set has increased from new photo taken
                  self.numberOfItemsInSection = ;
                  ;
                } else {
                  NSLog(@&#34;Error trying to save the record!&#34;);
                  NSLog(@&#34;ERROR: Error saving record to cloud...%@&#34;, error.localizedDescription);
                  ;
                  ;
                  ;
                }
            }];
            // where does this call belong?
            [self.ckManager recordProgressWithCompletionHandler:^(double progress) {
                dispatch_async(dispatch_get_main_queue(), ^{
                  NSLog(@&#34;Updating hud display...&#34;);
                  ;
                });
            }];
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您应该在 saveRecord 调用中包含进度处理程序,如下所示:</p>

<pre><code>- (void)saveRecord:(NSArray *)records withCompletionHandler:(void (^)(NSArray *, NSError *))completionHandler recordProgressHandler:(void (^)(double))progressHandler {

    NSLog(@&#34;INFO: Entered saveRecord...&#34;);
    CKModifyRecordsOperation *saveOperation = [ initWithRecordsToSave:records recordIDsToDelete:nil];

    saveOperation.perRecordProgressBlock = ^(CKRecord *record, double progress) {
      if (progress &lt;= 1) {
            NSLog(@&#34;Save progress is: %f&#34;, progress);
            progressHandler(progress)
      }
    };

    saveOperation.perRecordCompletionBlock = ^(CKRecord *record, NSError *error) {
      NSLog(@&#34;Save operation completed!&#34;);
      completionHandler(@, error);
    };

    ;
}
</code></pre>

<p>然后你可以像这样调用那个保存记录:</p>

<pre><code>      ] withCompletionHandler:^(NSArray *records, NSError *error) {
            if (!error &amp;&amp; records) {
                NSLog(@&#34;INFO: Size of records array returned: %lu&#34;, (unsigned long));
                CKRecord *record = ;
                self.imageDataAddedFromCamera.recordID = record.recordID.recordName;
                NSLog(@&#34;INFO: Record saved successfully for recordID: %@&#34;, self.imageDataAddedFromCamera.recordID);
                ;
                ;
                ; // update the model with the new image
                // update number of items since array set has increased from new photo taken
                self.numberOfItemsInSection = ;
                ;
            } else {
                NSLog(@&#34;Error trying to save the record!&#34;);
                NSLog(@&#34;ERROR: Error saving record to cloud...%@&#34;, error.localizedDescription);
                ;
                ;
                ;
            }
      }, recordProgressHandler:^(double progress) {
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@&#34;Updating hud display...&#34;);
                ;
            });
      }];
</code></pre>

<p>因此,更新进度的代码是您的 saveRecord 调用的一部分。
上面的代码未经我测试。所以我希望我没有错字</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何使用 CKModifyRecordsOperation.perRecordProgressBlock 更新进度,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/29473336/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/29473336/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何使用 CKModifyRecordsOperation.perRecordProgressBlock 更新进度