如何并行跟踪两个NSProgress?

时间:2015-07-06 18:00:14

标签: ios objective-c nsprogress

我有两个不同的大任务,每个任务有几个子任务。每个子任务都有一个子NSProgress,我手动更新。每个大任务都会托管一个包含多个

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

在不同时间拨打电话。通过此设置,两个大任务进度报告中的每一个都可以正常工作。

我的问题是我想并行执行这两个大任务,我想跟踪他们的整体进度。有没有办法做到这一点?

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

使两个任务顺序而不是并行修复了这个问题,但我真的想同时执行它们。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

是的,您可以与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个任务是异步的。这意味着即使任务仍在执行,也会立即调用resign调用。当我尝试在完成异步任务时辞职时,由于NSProgress已经在其他地方辞职,我得到了这个错误。所以像我的例子一样,Task1和Task2也是异步的,并且还包含子NSProgresses。您或多或少想要在启动异步任务后立即重新调整当前进度,而不是等到它完成。

作为附注,我喜欢使用100个单位作为待定,因此我可以将每个任务视为其中的百分比。您还可以对待处理的单元使用字节计数,但我倾向于在实际数据处理发生的较低子进程中执行此操作,而不是在父进程中执行此操作。像我的例子一样,我发送一个异步任务,用于将所有新的User对象上传到API,以及上传所有新用户照片的过程。照片任务计算照片的字节大小,并使用它来更新子进程,但父任务约占主要任务的40%,这就是我使用百分比的原因,因为有些时候你不知道如果您有复杂的多个对象进程,则聚合字节数。