gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:16:26 26 4
gpt4 key购买 nike

这与最近的话题有关 Update progress with MRProgress .作为上一个线程的结果,我将我的 cloudkit 查询从便利 API 转换为 CKOperations(感谢 Edwin!)。因此,在使用 CKModifyRecordsOperation 保存记录时,我可以通过登录 perRecordProgressBlock 来查看记录的进度,这很棒。但是,我正在尝试将此进度发送回 View Controller ,但我不知道该怎么做。我为我的所有 CloudKit 方法创建了一个类 - CKManager。我遇到的另一个问题是我不确定何时更新 VC 中的进度指示器(使用 MRProgress 框架)。我是在 CKManager 中调用保存操作之前、期间还是之后调用它?是否应该递归调用直到 progress == 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];
});
}];

最佳答案

您应该像这样在 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 调用的一部分。上面的代码没有经过我测试。所以我希望我没有打错字

关于ios - 如何使用 CKModifyRecordsOperation.perRecordProgressBlock 更新进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29473336/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com