Когда группа ALAssetsGroup большая, существует задержка в несколько секунд между вызовом времени enumerateAssetsUsingBlock: или enumerateAssetsAtIndexes: и временем вызова первого блока перечисления.
На iPad 2 с 10 000 ресурсов в библиотеке эта задержка составляет примерно 4,2 секунды до вызова первого блока ресурсов.
Photos.app на том же устройстве с той же библиотекой запускается менее чем за секунду, показывая все фотографии в библиотеке. Я понятия не имею, как это делается. Вот такое поведение мы хотели бы видеть.
Это минимальный тестовый пример, который показывает поведение:
ALAssetsLibrary* assetLibrary = [ALAssetsLibrary new];
[assetLibrary enumerateGroupsWithTypes:ALAssetsGroupLibrary
usingBlock:^(ALAssetsGroup *group, BOOL *stop)
{
if (group != nil) {
NSLog(@"*** Got library group, start timer");
NSDate* tic = [NSDate date];
[group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:0] options:0 usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop)
{
if (result==nil) {
NSLog(@"*** Elapsed time to final enumeration: %.2fs", -[tic timeIntervalSinceNow]);
}
else if (index==0) {
NSLog(@"*** Elapsed time to image 0: %.2fs", -[tic timeIntervalSinceNow]);
}
}];
*stop = YES;
}
}
failureBlock:^(NSError *error)
{
NSLog(@"ERROR: %@", [error localizedDescription]);
}];
Выход:
*** Got library group, start timer
*** Elapsed time to image 0: 4.20s
*** Elapsed time to final enumeration: 4.20s
(Обратите внимание, что решение, принятое в этом (немного другом) вопросе, не работает. Задержка происходит еще до того, как будет достигнут первый актив: Возможные способы ускорить чтение из ALAssetsLibrary и заполнение UITableView )