2012-06-19 109 views
2
ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init]; 
    [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos 
          usingBlock:libraryGroupsEnumeration 
         failureBlock:failureblock]; 
ALAssetsGroupEnumerationResultsBlock groupEnumerAtion = ^(ALAsset *result, NSUInteger index, BOOL *stop){ 
     if (result!=NULL) { 

      if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) { 

       [self._dataArray addObject:result]; 
      } 

     } 
    }; 

ALAssetsLibraryGroupsEnumerationResultsBlock 
    libraryGroupsEnumeration = ^(ALAssetsGroup* group, BOOL* stop){ 
     //within the group enumeration block.filter to enumerate just photos. 
     [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 
     if (group!=nil) { 
      NSString *g=[NSString stringWithFormat:@"%@",group]; 
      NSLog(@"gg:%@",g);//gg:ALAssetsGroup - Name:Camera Roll, Type:Saved Photos, Assets count:71 
      [group enumerateAssetsUsingBlock:groupEnumerAtion]; 
     } 
     else { 
      dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
       [self saveToDB:self._dataArray]; 

      }); 
     } 

    }; 

假設我的相機膠捲有100張照片,我想先得到30保存到我在上面的代碼database.but,我必須等待100個結果fisishing在寫入數據庫30之後,繼續獲得另一個30直到結束。 因爲獲得100張甚至更多的照片會延遲我的UI刷新。它看起來不舒服。 非常感謝!如何使用ALAssetLibrary獲得在相機膠捲本地照片

我該寫什麼?

回答

0

試試這個

if (result!=NULL) { 

    if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto])   { 

      [self._dataArray addObject:result]; 

      if([self._dataArray count] == 30){ 

       dispatch_async(dispatch_get_global_queue(0, 0), ^{ 

       NSArray *array = [[NSArray alloc] initWithArray:self._dataArray]; //please change the array declaration to top of this method. Because the Block will not allow to do it here.    
       [self._dataArray removeAllObjects]; 
       [self saveToDB:array]; 
       //array release,if not using ARC 

      }); 
     } 
    } 

} 

if (group!=nil) { 

      [group enumerateAssetsUsingBlock:groupEnumerAtion]; 
     } 
     else if([self._dataArray count] > 0) { 

       dispatch_async(dispatch_get_global_queue(0, 0), ^{ 

        [self saveToDB:self._dataArray]; 

      }); 
     } 
+0

謝謝。我明白了。 – HamasN

0

您應該嘗試在後臺線程上保存到數據庫,並讓CoreData(假設您使用CoreData)通過處理NSManagedObjectContextDidSaveNotification來更新主線程上的NSManagedObjectContext。

您仍然可以保存30張照片後,這可能會減輕一些I/O壓力,但是您必須測試性能。

+0

感謝您的answer.But可能是它不是最好的之一。 – HamasN

相關問題