2011-11-17 4 views
2

Je prévois d'obtenir/ajouter toutes les URL d'image de photothèque dans un NSMutableArray sur un fil distinct sans perturber l'exécution du programme ou du thread principal.Exécution du bloc ALAssetLibrary sur un thread séparé

Je dois effectuer le processus sur l'arrière-plan de l'application pendant que d'autres opérations sont en cours.

J'ai donc écrit le code ci-dessous sur mon App Delegate Class "didFinishLaunchingWithOptions" Déléguer et aussi la fonction ViewDidLoad de ma classe View Controller. Cependant, les autres fonctions ne fonctionnent pas pendant l'exécution du bloc ALAsset.

Mais la méthode "crcGeneration" fonctionne sans perturber les autres fonctionnalités. Comme on peut le voir dans le code ci-dessous, j'ai appelé la méthode "crcGeneration" dans le bloc ALAsset, dans le même fil, après avoir obtenu toutes les URL de la photothèque. Quelqu'un peut-il me dire un bon moyen de résoudre le problème?

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"); 

    }]; 

} 

Répondre

0

Essayez d'obtenir l'URL d'actifs comme ceci:

NSURL *url = [result valueForProperty:ALAssetPropertyAssetURL]; 

La mise en œuvre de -defaultRepresentation est probablement expédiait de manière synchrone sur la file d'attente principale.

Questions connexes