2013-09-02 3 views
1

Я пытаюсь фильтровать AlAssets по годам и месяцам. Я могу уже получать даты и фильтр по годам и месяцам, но это слишком медленно с примерно 1000 фотографиями. Каков наилучший способ сделать это?FIlter alassets по году

+ (void) loadFromLibraryByDate:(ALAssetsLibrary *)library assetType:(NSString *)type toArray:(NSMutableArray *)array onTable:(UITableView *)tableView onYear:(NSString *)year onMonth:(NSString *)mouth withDelegate:(id) delegate{ 

//clean passed objects 
[array removeAllObjects]; 

// filter for the library 
NSInteger groupType = ALAssetsGroupAll; 



// block to enumerate thought the groups 
ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = 
^(ALAssetsGroup *group, BOOL *stop){ 
    if(group){ 
     [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop){ 
      if(asset){ 
       //     cachedPhotos = [NSMutableDictionary new]; 

       if([asset valueForProperty:ALAssetPropertyType] == type){ 
        if(year != nil && mouth != nil) 
        { 
         NSDate *date = [asset valueForProperty:ALAssetPropertyDate]; 
         if(date.year == [year integerValue] && date.month == [mouth integerValue]) 
         { 
          [array addObject:asset]; 
         } 
        } 
        else if(year != nil && mouth == nil) 
        { 
         NSDate *date = [asset valueForProperty:ALAssetPropertyDate]; 
         NSString *monthName = [date monthName:date.month]; 
         if(date.year == [year integerValue]) 
         { 
          if(![array containsObject:monthName]) 
          { 
           [array addObject:monthName]; 
          } 
         } 
        } 
        else 
        { 
         NSDate *date = [asset valueForProperty:ALAssetPropertyDate]; 
         NSNumber *yearNum = [NSNumber numberWithInt:date.year]; 
         if(![array containsObject:yearNum]) 
         { 
          [array addObject:yearNum]; 
         } 
        } 
       } 
      } 
     }]; 
    } 
    else{ 
     if([delegate respondsToSelector:@selector(didFinishLoadingLibraryByDate:)]){ 
      [delegate performSelector:@selector(didFinishLoadingLibraryByDate:)]; 
     } 
     [tableView reloadData]; 
    } 
}; 

// failure block, what happens if when something wrong happens when enumerating 
ALAssetsLibraryAccessFailureBlock failBlock = ^(NSError *error){ 
    NSLog(@"Error: %@", [error localizedDescription]); 

    static dispatch_once_t pred; 

    dispatch_once(&pred, ^{ 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      UIAlertView *libraryFailure = [[UIAlertView alloc] initWithTitle:@"Serviço de Localização" message:@"Para poder partilhar conteúdos nesta versão iOS, tem de autorizar os serviços de localização. (Definições > Serviços de Localização)" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [libraryFailure show]; 
      [libraryFailure release]; 
     }); 

    }); 

}; 

[library enumerateGroupsWithTypes:groupType usingBlock:listGroupBlock failureBlock:failBlock]; 

Любая помощь приветствуется, спасибо

ответ

0

Я думаю, что вы на правильном пути. Я не знаю, как фильтровать метаданные, кроме как перечисляя то, как вы это делаете. К сожалению, перечисление через группы активов по своей сути является медленным в iOS - если вы считаете, что 1000 - это плохо, попробуйте 10k или 20k активов (совсем не редко, у меня это есть на моем телефоне для переноски прямо сейчас).

Один из способов обойти это (не обязательно рекомендуется, так как это большая работа и потенциал ошибки очень высок) заключается в создании собственной базы данных временных меток активов. Пока пользователь занят (с учебником или чем-то еще), перечислите все активы и скопируйте метаданные и ALAssetPropertyAssetURL в любой формат, который лучше всего подходит для вас. Не забудьте прислушаться к сообщениям ALAssetsLibraryChangedNotification, если вы это сделаете.

+0

Спасибо за ваш ответ. Я думал, что это лучший способ сделать это. Я думаю, что мне нужно жить с –

0

Вы должны сначала перечислить все ALAsset. Когда приложение запустится, а затем отфильтруйте их. Поскольку перечисление ALAsset из базы данных происходит настолько медленно, поэтому вам не следует повторно их повторять. Therer - это уведомление, более быстрое повторение ALAsset, чем первое. Apple должна оптимизировать библиотеку.

+0

, спасибо за ваш ответ. Очень медленно перечислять все AlAssets. Я попробую ваш подход –

Смежные вопросы