2013-09-02 3 views
1

나는 올해와 달까지 AlAssets를 필터링하려고합니다. 나는 이미 날짜와 필터를 년과 월별로 얻을 수 있지만 1000 장 정도의 사진으로는 너무 느립니다. 가장 좋은 방법은 무엇입니까?연도 별 필터 연도

+ (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 열거는 너무 느리기 때문에 다시 다시 열거해서는 안됩니다. 알리미가 더 빨리 알린 다음 다시 알리십시오. 애플은 도서관을 최적화해야한다.

+0

과 (과) 함께해야 할 일이라고 생각합니다. 모든 AlAssets를 열거하는 것은 정말로 느립니다. 당신의 접근 방식을 시도 할게요. –