- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有两个不同的大任务,每个任务都有几个子任务。每个子任务都有一个我手动更新的子 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.
}
您必须确保您的 2 个任务是异步的。这意味着立即调用 resign 调用,即使任务仍在执行。当我试图在完成异步任务时辞职时,由于 NSProgress
已经在其他地方辞职,我得到了那个错误。因此,就像我的示例一样,Task1 和 Task2 也是异步的,并且其中还包含子 NSProgresses。您或多或少希望在启动异步任务后立即放弃当前进度,而不是等到它完成。
作为旁注,我喜欢使用 100 个单位作为待处理,这样我就可以将每个任务视为它的百分比。您也可以对未决单元使用字节计数,但我倾向于在发生实际数据处理的较低子进程而不是在父进程中这样做。就像我的例子一样,我分派(dispatch)了一个异步任务来将所有新用户对象上传到 API 和一个进程来上传所有新用户照片。照片任务计算照片的字节大小并将其用于更新子进程,但父任务大约占主任务的 40%,这就是我使用百分比的原因,因为有时您不知道聚合字节数,如果您具有复杂的多对象过程。
关于ios - 如何并行跟踪两个 NSProgress?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31252591/
我正在实现NSProgress支持库,我编写了一些单元测试来测试一切是否正常工作。虽然理想情况下我希望能够传递一些额外的元数据( userInfo key 不被 NSProgress 本身使用,但供我
在 AFNetworking 中我找到了这个函数: - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
我有两个不同的大任务,每个任务都有几个子任务。每个子任务都有一个我手动更新的子 NSProgress。每个大任务都有一个父 NSProgress 和几个 [progress becomeCurrent
我想将属性观察器添加到 NSProgress。我有这段代码,但它只调用了一次。 var progress: NSProgress? { didSet { println
我有一个包含多个子任务的大任务。我想为那个大任务添加进度报告。 为此,我想使用 NSProgress,根据类文档,我可以通过使用它的子-父机制来完成这种子任务进度。 为了简化它,假设我有一个包含一个子
我正在试验 NSProgress,发现后台线程上的一个简单循环会导致内存快速增长: class Worker { var progress:NSProgress? func doWor
我正在尝试使用 Alamofire 下载文件,但有进展。但我在 progress 行收到此错误。 无法调用非函数类型“NSProgress”的值 有什么问题?我见过的所有例子,即 the offici
我使用 [manager downloadTaskWithRequest:request Progress:&progress destination:^NSURL *(NSURL *targetPa
NSProgress允许用户取消或恢复工作。您可以通过调用 pause 来暂停 NSProgress 对象。 如何恢复暂停的 NSProgress 对象? NSProgress 的文档实际上并未提及恢
假设我有一些 NSProgress 对象的层次结构。为简单起见,假设有 2 个 child 的 root progress。如果进度已经开始,我可以向层次结构添加另一个子进度并期望正确的事情发生吗?例
我正在尝试使用 AFNetworking 和 NSProgress 跟踪我的 HTTP 请求的进度。基本上,我的请求是一个包含文本参数和图像数据的多部分表单数据,所有这些都在一个 block 中。 这
根据documentation for NSProgress我看到 -[NSProgress localizedAdditionalDescription] 可以报告下载速度和剩余时间,例如: 1.6
我正在使用 KVO 来跟踪正在接收的文件的进度: -(void)session:(MCSession *)session didStartReceivingResourceWithName:(NSSt
(void)URLSession:(NSURLSession *)session 任务:(NSURLSessionTask *)任务didSendBodyData:(int64_t)bytesSent
我正在使用 AFNetworking 3.1.0 并且GET:parameters:success:failure 已弃用,因此我想使用 GET:parameters:progress:success
我已经使用乘数连接从循环中为连接的对等点实现了文件发送功能。即代码如下。 for connectedPeer in self.connectedPeers { let sendingPr
我有这个观察者,我正在尝试以这种方式更新我的 UIProgressView: - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(
我使用 NSProgress 来通知复杂任务的进度(该任务由许多子任务组成,可以由其他子任务组成)。 我在 startTask 方法中创建主要进度: - (void)_startTask {
我又回来了蜂群思维! 在我的 ViewController 类中,我有一个函数可以循环访问数组中的一系列项目。我想要发生的是在循环的每次迭代中更新我的进度条,但它似乎在完成整个循环并退出我的函数之前不
我目前正在使用 owncloud iOS SDK将文件上传到我的私有(private)云。我正在尝试引入 Key-Value 观察机制 provided in this example到 swift
我是一名优秀的程序员,十分优秀!