我确信这已经发生在某人身上,但我无法找到可靠的来源(在Stackoverflow或其他地方)来解决这个问题。
我必须下载(有限)数量的文件。在下载之前我不知道它们的大小。它们的大小可能会发生很大变化,在开始下载之前我不知道它。
经常会发生我有9个非常小的文件和1个非常大的文件。
如果我使用NSProgress
及其“子”功能,我将很快显示完成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
,这让我对后端做了更多的查询,但至少经验有点好
如果我能删除它会更好。有什么想法吗?