没有事先了解孩子的“大小”的NSProgress树

时间:2014-07-04 08:53:48

标签: ios objective-c nsprogress

我确信这已经发生在某人身上,但我无法找到可靠的来源(在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,这让我对后端做了更多的查询,但至少经验有点好

如果我能删除它会更好。有什么想法吗?

0 个答案:

没有答案