2014-07-21 4 views
0

Dans cet extrait de code, le flux du programme passe à en dehors de la boucle d'abord, puis passe à l'intérieur du bloc
resultBlock:^(ALAsset * asset). Le code imprime d'abord le NSLog en bas puis exécute le bloc à l'intérieur de la boucle. Qu'est-ce qu'il se passe ici?Le flux du programme ne fonctionne pas

ALAssetsLibrary *lib=[ALAssetsLibrary new]; 
    _sizeOfSelectedImage=0; 
     for (int i=0; i<assets.count; i++) { 
      ALAsset *asset=assets[i]; 
      FileOP *fileMgr=[[FileOP alloc]init]; 
      NSString *baseDir=[fileMgr GetDocumentDirectory]; 

      //STORING FILE INTO LOCAL 

      [lib assetForURL:asset.defaultRepresentation.url 
       resultBlock:^(ALAsset *asset){ 
        ALAssetRepresentation *repr = [asset defaultRepresentation]; 
        CGImageRef cgImg = [repr fullResolutionImage]; 
        NSString *fname = repr.filename; 
        UIImage *img = [UIImage imageWithCGImage:cgImg]; 
        NSData *data = UIImagePNGRepresentation(img); 
        [data writeToFile:[baseDir stringByAppendingPathComponent:fname] 
          atomically:YES]; 
        //FOR LOCAL URL OF THE IMAGE 
        //NSString *imageURL = [baseDir stringByAppendingPathComponent:fname]; 
        //UIImage *myImg =[UIImage imageWithContentsOfFile:imageURL]; 
        //NSLog(@"%@ URL OF IMAGE ",imageURL); 
        NSLog(@"Image %d has %d size",i,data.length); 
        _sizeOfSelectedImage +=data.length; 
        NSLog(@"%d is the size",_sizeOfSelectedImage); 

       } 
          failureBlock:^(NSError *error){ 

       }]; 
     } 

     NSLog(@"COPIED %lu FILE INTO LOCAL MEMORY AND TOTAL SIZE COPIED IS %d ",(unsigned long)assets.count,_sizeOfSelectedImage); 
+0

Je devine que le bloc est un bloc, il ne retourne pas d'abord. – klcjr89

+0

C'est mon problème. Je ne sais pas pourquoi ça sort de la boucle avant d'exécuter le bloc. Et il revient à la boucle à nouveau. Je traverse des points de rupture. Le programme va à l'intérieur de la boucle for. Et là où le bloc commence, il sort de la boucle. Imprime NSLog en bas. Puis revient à la boucle. –

+1

C'est comme ça que ça doit être. – klcjr89

Répondre

3

Méthode assetForURL: resultBlock: failureBlock: exécute le chargement de l'équipement de manière asynchrone. C'est pourquoi nous avons d'abord exécuté le NSLog du bas puis Block. Si vous voulez qu'il soit exécuté de façon synchrone, faites comme ceci:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) ^{ 
     ALAssetsLibrary *lib=[ALAssetsLibrary new]; 
     _sizeOfSelectedImage=0; 

     dispatch_group_t group = dispatch_group_create(); 

     for (int i=0;i<assets.count;i++) { 
       ALAsset *asset=assets[i]; 
       FileOP *fileMgr=[[FileOP alloc]init]; 
       NSString *baseDir=[fileMgr GetDocumentDirectory]; 

       //STORING FILE INTO LOCAL 
       dispatch_group_enter(group); 
       [lib assetForURL:asset.defaultRepresentation.url 
        resultBlock:^(ALAsset *asset){ 
         ALAssetRepresentation *repr = [asset defaultRepresentation]; 
         CGImageRef cgImg = [repr fullResolutionImage]; 
         NSString *fname = repr.filename; 
         UIImage *img = [UIImage imageWithCGImage:cgImg]; 
         NSData *data = UIImagePNGRepresentation(img); 
         [data writeToFile:[baseDir stringByAppendingPathComponent:fname] 
           atomically:YES]; 
         //FOR LOCAL URL OF THE IMAGE 
         //NSString *imageURL = [baseDir stringByAppendingPathComponent:fname]; 
         //UIImage *myImg =[UIImage imageWithContentsOfFile:imageURL]; 
         //NSLog(@"%@ URL OF IMAGE ",imageURL); 
         NSLog(@"Image %d has %d size",i,data.length); 
         _sizeOfSelectedImage +=data.length; 
         NSLog(@"%d is the size",_sizeOfSelectedImage); 
         dispatch_group_leave(group); 
        } 
        failureBlock:^(NSError *error){ 
           dispatch_group_leave(group); 
        }]; 
      } 
      dispatch_group_wait(group, DISPATCH_TIME_FOREVER); 
      NSLog(@"COPIED %lu FILE INTO LOCAL MEMORY AND TOTAL SIZE COPIED IS %d ",(unsigned long)assets.count,_sizeOfSelectedImage); 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       // Do your call back on main thread here 
      }); 
    }); 

Edit1: réponse améliorée de Ken

ALAssetsLibrary *lib=[ALAssetsLibrary new]; 
_sizeOfSelectedImage=0; 

dispatch_group_t group = dispatch_group_create(); 

for (int i=0;i<assets.count;i++) { 
    ALAsset *asset=assets[i]; 
    FileOP *fileMgr=[[FileOP alloc]init]; 
    NSString *baseDir=[fileMgr GetDocumentDirectory]; 

    //STORING FILE INTO LOCAL 
    dispatch_group_enter(group); 
    [lib assetForURL:asset.defaultRepresentation.url 
     resultBlock:^(ALAsset *asset){ 
      ALAssetRepresentation *repr = [asset defaultRepresentation]; 
      CGImageRef cgImg = [repr fullResolutionImage]; 
      NSString *fname = repr.filename; 
      UIImage *img = [UIImage imageWithCGImage:cgImg]; 
      NSData *data = UIImagePNGRepresentation(img); 
      [data writeToFile:[baseDir stringByAppendingPathComponent:fname] 
        atomically:YES]; 
      //FOR LOCAL URL OF THE IMAGE 
      //NSString *imageURL = [baseDir stringByAppendingPathComponent:fname]; 
      //UIImage *myImg =[UIImage imageWithContentsOfFile:imageURL]; 
      //NSLog(@"%@ URL OF IMAGE ",imageURL); 
      NSLog(@"Image %d has %d size",i,data.length); 
      _sizeOfSelectedImage +=data.length; 
      NSLog(@"%d is the size",_sizeOfSelectedImage); 
      dispatch_group_leave(group); 
     } 
     failureBlock:^(NSError *error){ 
      dispatch_group_leave(group); 
     }]; 
} 
dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
    // Do your call back on main thread here 
    NSLog(@"COPIED %lu FILE INTO LOCAL MEMORY AND TOTAL SIZE COPIED IS %d ",(unsigned long)assets.count,_sizeOfSelectedImage); 

    // Your code here 
}); 
+1

C'était ma première pensée! Comment le rendre synchrone et corriger le flux de programme toute idée? –

+0

Je l'ai essayé. Il a gelé mon application. –

+2

N'essayez pas de synchroniser les méthodes asynchrones. Changez votre logique de programme pour gérer la synchronisation. Dans ce cas, placez le journal final dans le bloc résultat. –

Questions connexes