Древо НСПрогресс без предварительных знаний о "размере" детей

Я уверен, что это уже произошло с кем-то, но я не смог найти надежный источник (в Stackru или в другом месте), чтобы решить эту проблему.

Я должен загрузить (конечное) количество файлов. Я не знаю их размер до их загрузки. Их размер может сильно измениться, и я не знаю его до начала загрузки.

Часто бывает, что у меня 9 действительно маленьких файлов и 1 очень большой файл. Если я использую NSProgress с его функцией "дети" я очень быстро покажу завершение 90%, тогда пользовательский интерфейс будет зависать (хотя это не так), так как последний файл намного больше.

Вот пример кода, где я моделирую большой файл.

- (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 ответов

Другие вопросы по тегам