在单独的线程上运行ALAssetLibrary块

时间:2011-11-17 14:31:21

标签: iphone cocoa-touch objective-c-blocks nsthread

我打算在一个单独的线程上将所有照片库图像URL添加/添加到NSMutableArray中,而不会干扰程序或主线程的执行。

我需要在应用程序背景上执行此过程,而其他操作正在进行中。

所以我在我的App Delegate Class “didFinishLaunchingWithOptions” Delegate以及View Controller Class的ViewDidLoad函数中编写了下面的代码。

但是,当执行ALAsset块时,其他功能无效。

但是方法“crcGeneration”正在运行而不会打扰其他功能。正如我在下面的代码中看到的那样,在得到所有照片库URL之后,我在同一个线程中调用了ALAsset Block中的方法“crcGeneration”

任何人都可以告诉我解决问题的好方法吗?

OnViewDidLoad:

//Calling the getAllURLofPhotLibraryImages Function on a seperate Thread.
[NSThread detachNewThreadSelector:@selector(getAllURLofPhotLibraryImages) toTarget:self withObject:nil];


Function for Getting all image URL's of PhotoLibrary.
**-(void)getAllURLofPhotLibraryImages**
{
   urlStoreArray = [[NSMutableArray alloc] init];     //global array


      void (^assetEnumerator)(struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop)
      {
           if(result != NULL)
               {

                // Here storing the asset's image URL's in NSMutablearray urlStoreArr
                NSURL *url = [[result defaultRepresentation] url];
                [urlStoreArray addObject:url];                
          }

      };

      void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop)
      {

           if(group != nil)
           {
                [group enumerateAssetsUsingBlock:assetEnumerator];
           }
           else
           {       

               **[self crcGeneration];**   //Genearting CRC for PhotoLibrary Images using urlStoreArray after got all the Photo Library URL's .
           }

      };
 ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
  [assetslibrary enumerateGroupsWithTypes:ALAssetsGroupAll       usingBlock:assetGroupEnumerator   failureBlock: ^(NSError *error) {        NSLog(@"Failure" );

     }];

}

1 个答案:

答案 0 :(得分:0)

尝试获取资产网址:

NSURL *url = [result valueForProperty:ALAssetPropertyAssetURL];

-defaultRepresentation的实现可能同步调度到主队列。