是的,您可以与NSProgress
. 这是我所做的一个片段。
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 个单位作为待处理,因此我可以将每个任务视为其中的百分比。您也可以对待处理的单元使用字节数,但我倾向于在发生实际数据处理的较低子进程而不是在父进程中这样做。像我的示例一样,我分派了一个异步任务,用于将所有新用户对象上传到 API,以及一个用于上传所有新用户照片的过程。照片任务计算照片的字节大小并将其用于更新子进程,但父任务大约占主任务的 40%,这就是我使用百分比的原因,因为有时如果你不知道聚合字节数具有复杂的多对象过程。