Перечисление AlAssetsGroup требует много времени для запуска в больших группах.

Когда группа 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 )


person Eric Brochu    schedule 16.01.2013    source источник
comment
пожалуйста, проверьте мой ответ здесь блокировать с помощью алассета"> stackoverflow.com/questions/13508535/   -  person Shamsudheen TK    schedule 11.02.2013
comment
Спасибо, @ramshad, это хорошая мысль, но я уже пробовал, и нет, похоже, это не проблема блокировки потока. Помещение вызова метода в dispatch_sync(dispatch_get_main_queue(), {...}) не меняет его. И в любом случае нет причин блокировать основной поток на 4+ секунды.   -  person Eric Brochu    schedule 12.02.2013
comment
Ты когда-нибудь понимал это, @Ramshad?   -  person William LeGate    schedule 05.12.2014
comment
пожалуйста, проверьте эти две ссылки: - stackoverflow.com/questions/13508535/   -  person Shamsudheen TK    schedule 05.12.2014
comment
stackoverflow.com/questions/10239242/   -  person Shamsudheen TK    schedule 05.12.2014