2

我确信这已经发生在某人身上,但我找不到可靠的来源(在 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,这使我对后端进行了更多查询,但至少体验要好一些。

如果我能把它去掉就更好了。有任何想法吗?

4

0 回答 0