Древо НСПрогресс без предварительных знаний о "размере" детей
Я уверен, что это уже произошло с кем-то, но я не смог найти надежный источник (в 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
, и это заставляет меня делать больше запросов к бэкэнду, но, по крайней мере, опыт немного лучше.
Если бы я мог удалить это, было бы намного лучше. Есть идеи?