我有两个不同的大任务,每个任务都有几个子任务。每个子任务都有一个子NSProgress,我手动对其进行更新。每个大任务都托管一个父NSProgress,其中有几个

[progress becomeCurrentWithPendingUnitCount:1.0]
// Perform subtask which generates the child `NSProgress`.
[progress resignCurrent]

在不同时间打电话。此设置可以很好地完成两个大任务进度报告。

我的问题是我想并行执行这两个大任务,并且希望整体跟踪它们的进度。有什么办法吗?

我尝试在外部创建一个NSProgress对象来包装两个大任务的NSProgress(因此总共三个NSProgress级别),但是问题是两个任务在更新进度时会“打架”。也就是说,一个任务可以执行becomeCurrentWithPendingUnitCount:,然后另一个任务可以执行resignCurrent,这会导致异常(因为第二个任务的NSProgress不是当前的)。

使两个任务依次而不是并行解决了该问题,但是我真的很想同时执行它们。有任何想法吗?

最佳答案

是的,您可以与NSProgress并行运行2个异步操作。这是我所做的摘要。

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        [self.progress becomeCurrentWithPendingUnitCount:40];
        [self startAsyncTask1];
        [self.progress resignCurrent];
        [self.progress becomeCurrentWithPendingUnitCount:60];
        [self startAsyncTask2];
        [self.progress resignCurrent];
    });

- (void)startAsyncTask1{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        NSProgress *taskProgress = [NSProgress progressWithTotalUnitCount:allUsers.count];
        [taskProgress becomeCurrentWithPendingUnitCount:allUsers.count];
        [self startUploadingAllUsers];
        [taskProgress resignCurrent];
    });
}
-(void)startUploadingAllUsers{
    for(id user in allUsers){
        [self uploadUser:user];
    }
}
-(void)uploadUser:(id)user{
    NSProgress *taskProgress = [NSProgress progressWithTotalUnitCount:user.photos.count];
    //Do upload and in completion of photo upload increment taskProgress.completedUnitCount
    //This last task does not get resigned. It does not become active either.
}

您必须确保您的2个任务是异步的。这意味着即使任务仍在执行,也将立即调用辞职 call 。当我尝试在完成异步任务时辞职时,由于NSProgress已经在其他地方辞职,导致出现该错误。因此,就像我的示例一样,Task1和Task2也异步,并且它们中还包含子NSProgresses。您或多或少希望在启动异步任务之后立即辞职,而不要等到完成后再辞职。

附带说明一下,我喜欢使用100个单位作为待处理单位,因此我可以将每个任务视为其百分比。您还可以将字节数用于待处理的单元,但我倾向于在发生实际数据处理的较低子进程而不是父进程中执行。像我的示例一样,我调度了一个异步任务,用于将所有新的User对象上载到API,以及一个过程,用于上载所有新的用户照片。照片任务会计算照片的字节大小,并将其用于更新子进程,但父任务约占主任务的40%,这就是为什么我使用百分比,因为有时您不知道汇总的字节数,如果您具有复杂的多对象流程。

关于ios - 如何并行跟踪两个NSProgress?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31252591/

10-12 14:47