2014-10-30 2 views
0
-(void) objectParsed_ListAllMedia:(NSDictionary *)dictionary 
{ 
@try { 

     self.viewLoading.hidden=1; 

     [self.arrGaalleryMediaName removeAllObjects]; 
     [self.arrMediaNames removeAllObjects]; 


     if(self.arrOnlyServerImages == nil){ 
      self.arrOnlyServerImages = [[NSMutableArray alloc] init]; 
     } 

     if([self.arrOnlyServerImages count] >0){ 
      [self.arrOnlyServerImages removeAllObjects]; 
     } 


     if (dictionary==nil) { 

      [self.gridCollectionView reloadData]; 
      return; 
     } 
     // Filter Array for Audio file 

     NSPredicate *predicate = [NSPredicate predicateWithFormat: @"type != 'audio' "]; 
     self.arrOnlyServerImages = [NSMutableArray arrayWithArray:[[dictionary objectForKey:@"objects"] filteredArrayUsingPredicate:predicate]]; 



     // Remove duplicate Start //Read Meta Data and Duplicate from Download, Duplicate from upload START 

     dispatch_queue_t backgroundQueue = dispatch_queue_create("com.memreas.myqueue", 0); 

     dispatch_async(backgroundQueue, ^{ 

      NSMutableArray *arr = [NSMutableArray array]; 
      NSMutableIndexSet * indexSet = [NSMutableIndexSet indexSet]; 

      for (int i=0; self.assetAry.count>i; i++) { 

       ALAsset *result =self.assetAry[i]; 
       ALAssetRepresentation *imageRep = [result defaultRepresentation]; 
       NSDictionary * customMetaDic = [imageRep metadata][(NSString*)kCGImagePropertyIPTCDictionary]; 

       if (customMetaDic) { 

        [self.arrMediaNames addObject:customMetaDic[(NSString*)kCGImagePropertyIPTCObjectName]?customMetaDic[(NSString*)kCGImagePropertyIPTCObjectName]:@""]; 
       }else{ 
        [self.arrMediaNames addObject:@""]; 
       } 

       [self.arrGaalleryMediaName addObject:[self getFileNameWithExtensionFromPath:imageRep.url]]; 

      } 


      for (int i=0; self.arrOnlyServerImages.count>i; i++) { 

       NSMutableDictionary* obj = self.arrOnlyServerImages[i]; 
       NSMutableDictionary * dic2 = [NSMutableDictionary dictionaryWithDictionary:obj]; 
       BOOL isArrMedia =[self.arrMediaNames containsObject:dic2[@"media_name"]]; 
       BOOL isGallery =[self.arrGaalleryMediaName containsObject:dic2[@"media_name"]]; 

       if (isArrMedia||isGallery) { 

        dic2[@"isDownloaded"] = [NSNumber numberWithBool:YES]; 
        [indexSet addIndex: isArrMedia?[self.arrMediaNames indexOfObject:dic2[@"media_name"]] :[self.arrGaalleryMediaName indexOfObject:dic2[@"media_name"]]]; 

       }else{ 

        dic2[@"isDownloaded"] = [NSNumber numberWithBool:NO]; 
       } 

       [arr addObject:dic2]; 

      } 

      dispatch_async(dispatch_get_main_queue(), ^{ 

       @try { 

        self.arrOnlyServerImages = arr; 
        [self.assetAry removeObjectsAtIndexes:indexSet]; 
        [self.gridCollectionView reloadData]; 

       } 
       @catch (NSException *exception) { 
        NSLog(@"%@",exception); 
        [self.gridCollectionView reloadData]; 
       } 

      }); 


     }); 

     // Remove duplicate END //Read Meta Data and Duplicate from Download, Duplicate from upload END 

     [self.gridCollectionView reloadData]; 
     [self.gridView.collectionView reloadData]; 
     [self.location performSelector:@selector(stopActivity) withObject:nil afterDelay:2]; 


    } 
    @catch (NSException *exception) { 
     NSLog(@"%@",exception); 
    } 

} 

이 코드를 실행하는 동안 메모리 압력 문제가 발생하고 응용 프로그램이 다운됩니다.메모리 압력 읽기 관련 문제 메타 데이터 및 중복 제거

기능은 다음과 같습니다

나는 서버 및 지역 자산에서 모든 이미지를로드하고 파일 이름으로 서로 일치하고 목록에서 중복 된 이미지를 제거, 그래서 한 번만 볼 것이다.

아무도 해결책이 있으니 도움주세요.

미리 감사드립니다.

+0

코드에서 빠른 봐 - 내가 거기에'Mutable' 변수를 많이 참조하십시오. 코드를 최적화하고 대신 불변 변수를 사용하십시오. – Kampai

+0

요구 사항이 그런 것이므로 변경 불가능한 요소가 필요합니다. 인덱스 실행 시간에 개체를 제거해야합니다. – Faizan

+0

임시 변수'mutable'을 생성하고 작업을 수행 할 수 있습니다. 또한 변수'dic2'를 보아라. - 배열에'mutable' 사전을 추가하고있다. 대신 NSMutableDictionary에서 NSDictionary를 만들고 배열에 추가 한 후 NSMutableDictionary를 제거하십시오. – Kampai

답변

0

메모리 집약적 인 작업 (ALAssetRepresentations)에 단단한 루프를 사용하고 있습니다. 이러한 경우 로컬 자동 복구 풀을 사용하면 ARC가 메모리 사용을 줄일 수 있습니다. 당신이 self.assetAry 통과 루프 내부

, 그래서 같은 autoreleasepool 모든 것을 포장 :

@autoreleasepool { 
    AlAsset *asset = ... 
    ... 
    // Rest of your code 
} 
+0

감사합니다. 시험해 보겠습니다. – Faizan