我确信这已经发生在某人身上,但我找不到可靠的来源(在 Stackoverflow 或其他地方)来解决这个问题。
我必须下载(有限)数量的文件。在下载它们之前我不知道它们的大小。它们的大小可能会发生很大变化,在开始下载之前我不知道。
我经常有 9 个非常小的文件和 1 个非常大的文件。如果我使用NSProgress
它的“children”功能,我会很快显示 90% 的完成,然后 UI 似乎会卡住(即使不是这种情况),因为最后一个文件要大得多。
这是我模拟大文件的示例代码。
- (void)viewDidLoad
{
[super viewDidLoad];
nbTasks = 10;
mainProgress = [NSProgress progressWithTotalUnitCount:nbTasks];
[self launch];
}
- (void)launch {
for (int i = 0; i < nbTasks; ++i) {
[mainProgress becomeCurrentWithPendingUnitCount:1];
[self launchWithNumber:i];
[mainProgress resignCurrent];
}
}
- (void)launchWithNumber:(int)count {
int max = count == 0 ? 100 : 10;
NSProgress *localProgress = [NSProgress progressWithTotalUnitCount:max];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
for (int i = 0; i < max; ++i) {
localProgress.completedUnitCount++;
[NSThread sleepForTimeInterval:1];
}
});
}
becomeCurrentWithPendingUnitCount
如果您在开始下载之前不知道它的重量,您将如何处理这种无法更改的情况?
编辑:这就是我现在所做的:
首先:我撒谎了。我不下载文件,而是从数据库中下载数据,但最终还是同样的问题。
在创建我的根之前NSProgress
,我从我的后端(SELECT count(*) FROM ...
)下载对象的数量。有了这个,我可以becomeCurrentWithPendingUnitCount
用正确的“权重”打电话,进度看起来更“顺利”。
当然,这对我来说远非理想,因为我必须等待一段时间才能显示第一个NSProgress
,这使我对后端进行了更多查询,但至少体验要好一些。
如果我能把它去掉就更好了。有任何想法吗?