如何并行跟踪两个NSProgress



我有两个不同的大任务,每个任务都有几个子任务。每个子任务都有一个子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.
}

你必须确保你的两个任务是异步的。这意味着立即调用辞职调用,即使任务仍在执行。当我试图在完成异步任务时辞职时,由于NSProgress已经在其他地方辞职,我得到了该错误。就像我的例子Task1和Task2也是异步的它们也包含子nsprogress。您或多或少希望在启动异步任务后立即退出当前进度,而不是等到它完成。

作为旁注,我喜欢使用100个单位作为待处理任务,这样我就可以将每个任务视为其百分比。你也可以对挂起的单元使用字节计数,但我倾向于在实际数据处理发生的较低的子进程中这样做,而不是在父进程中。与我的示例一样,我调度了一个用于将所有新User对象上传到API的异步任务和一个用于上传所有新用户照片的进程。photo任务计算照片的字节大小,并使用它来更新子进程,但父任务约占主任务的40%,这就是我使用百分比的原因,因为如果您有复杂的多对象进程,有时您不知道聚合字节计数。

相关内容

  • 没有找到相关文章

最新更新