我有两个不同的大任务,每个任务都有几个子任务。每个子任务都有一个我手动更新的子NSProgress。每个大任务都有一个父NSProgress,它有几个
[progress becomeCurrentWithPendingUnitCount:1.0]
// Perform subtask which generates the child `NSProgress`.
[progress resignCurrent]在不同的时间打电话。这两个大任务的进度报告都可以在这种设置下很好地工作。
我的问题是,我希望并行执行这两个大任务,并且希望跟踪它们的整体进度。有没有办法做到这一点?
我曾尝试在外层创建一个NSProgress对象来包装两个大任务的NSProgress (因此总共有三个NSProgress级别),但问题是这两个任务在更新进度时“打架”。也就是说,一个任务可以执行becomeCurrentWithPendingUnitCount:,然后另一个任务可以执行resignCurrent,这会导致异常(因为第二个任务的NSProgress不是最新的)。
让两个任务顺序执行而不是并行可以解决这个问题,但我真的很想同时执行它们。有什么想法吗?
发布于 2015-07-07 03:41:16
可以,您可以在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.
}你必须确保你的两个任务是异步的。这意味着即使任务仍在执行,也会立即调用resign调用。当我试图在完成一个异步任务时辞职时,由于NSProgress已经在其他地方被辞职的事实,我得到了这个错误。因此,与我的示例一样,Task1和Task2也是异步的,并且还包含子NSProgresses。您或多或少希望在启动异步任务后立即放弃当前的进度,而不是等到它完成。
顺便说一句,我喜欢使用100个单位作为待决单位,这样我就可以将每个任务看作是它的百分比。您也可以对挂起的单元使用字节计数,但我倾向于在实际数据处理发生的较低子进程中执行此操作,而不是在父进程中。与我的示例一样,我分派了一个异步任务,用于将所有新用户对象上传到API,以及一个用于上传所有新用户照片的进程。照片任务计算照片的字节大小,并将其用于更新子进程,但父任务大约占主任务的40%,这就是我使用百分比的原因,因为有时如果有复杂的多个对象进程,您不知道聚合的字节数。
https://stackoverflow.com/questions/31252591
复制相似问题