首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何并行跟踪两个NSProgress?

如何并行跟踪两个NSProgress?
EN

Stack Overflow用户
提问于 2015-07-07 02:00:14
回答 1查看 896关注 0票数 2

我有两个不同的大任务,每个任务都有几个子任务。每个子任务都有一个我手动更新的子NSProgress。每个大任务都有一个父NSProgress,它有几个

代码语言:javascript
复制
[progress becomeCurrentWithPendingUnitCount:1.0]
// Perform subtask which generates the child `NSProgress`.
[progress resignCurrent]

在不同的时间打电话。这两个大任务的进度报告都可以在这种设置下很好地工作。

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

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

让两个任务顺序执行而不是并行可以解决这个问题,但我真的很想同时执行它们。有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2015-07-07 03:41:16

可以,您可以在NSProgress中并行运行2个异步操作。这是我所做的事情的一小段。

代码语言:javascript
复制
   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%,这就是我使用百分比的原因,因为有时如果有复杂的多个对象进程,您不知道聚合的字节数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31252591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档