Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Wait for assetForURL blocks to be completed

Tags:

I would like to wait this code to be executed before to continue but as these blocks are called assynchronously I don't know how to do???

NSURL *asseturl; NSMutableArray *tmpListAsset = [[NSMutableArray alloc] init];  ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease]; NSMutableArray *objectsToRemove = [[NSMutableArray alloc] init]; for (NSDictionary *dico in assetsList) {     asseturl = [NSURL URLWithString:[dico objectForKey:@"assetUrl"]];     NSLog(@"asset url %@", asseturl);     // Try to load asset at mediaURL     [library assetForURL:asseturl resultBlock:^(ALAsset *asset) {         // If asset doesn't exists         if (!asset){             [objectsToRemove addObject:dico];         }else{             [tmpListAsset addObject:[asseturl absoluteString]];             NSLog(@"tmpListAsset : %@", tmpListAsset);         }     } failureBlock:^(NSError *error) {         // Type your code here for failure (when user doesn't allow location in your app)     }]; } 
like image 695
Mathieu Avatar asked Aug 29 '11 18:08

Mathieu


1 Answers

GCD semaphore approach:

dispatch_semaphore_t sema = dispatch_semaphore_create(0); dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);  for (NSURL *url in self.assetUrls) {     dispatch_async(queue, ^{         [library assetForURL:url resultBlock:^(ALAsset *asset) {             [self.assets addObject:asset];             dispatch_semaphore_signal(sema);         } failureBlock:^(NSError *error) {             dispatch_semaphore_signal(sema);         }];     });     dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); } dispatch_release(sema);  /* Check out ALAssets */ NSLog(@"%@", self.assets); 
like image 192
Chad Podoski Avatar answered Sep 20 '22 18:09

Chad Podoski