Requêtes d'URL asynchronouss dans dispatch_async

J'essaie d'implémenter des requêtes url asynchronouss dans une fonction particulière, je veux que toutes ces requêtes se terminent et ensuite faire une action particulière mais l'action précède les requêtes c'est-à-dire qu'elle est appelée avant la fin des requêtes.

dispatch_queue_t fetchQ = dispatch_queue_create("Featured Doc Downloader", NULL); dispatch_async(fetchQ, ^{ [self myAsyncMultipleURLRequestFunction]; dispatch_sync(dispatch_get_main_queue(), ^{ [self updateUIFunction]; }); }); -(void)myAsyncMultipleURLRequestFunction { for (int i=0; i<count; i++) { NSURLConnection *loginConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; } } 

maintenant updateUIFunction est appelée avant que myAsyncMultipleURLRequestFunction termine toutes les requests. J'ai aussi essayé cela avec NSOperaitonQueue mais je n'ai pas pu faire ce que je voulais vraiment.

 [_operationQ addOperationWithBlock: ^ { for (int i=0; i<count; i++) { NSURLConnection *loginConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; } } [[NSOperationQueue mainQueue] addOperationWithBlock: ^ { // updating UI [self updateUIFunction]; }]; }]; 

Je sais que c'est simple mais je manque de time, toute aide est appréciée.

@tkanzakic est sur le bon path. La construction correcte à utiliser est le dispatch_group_t. Mais la mise en œuvre pourrait être améliorée. En utilisant un sémaphore, vous pouvez lancer tous vos téléchargements de manière asynchronous tout en vous assurant que vous n'en avez pas trop en cours d'exécution. Voici un exemple de code qui illustre comment vous devez utiliser dispatch_group_t ainsi que tous vos téléchargements parallèles:

 dispatch_queue_t fetchQ = dispatch_queue_create("Featured Doc Downloader", NULL); dispatch_group_t fetchGroup = dispatch_group_create(); // This will allow up to 8 parallel downloads. dispatch_semaphore_t downloadSema = dispatch_semaphore_create(8); // We start ALL our downloads in parallel throttled by the above semaphore. for (int i=0; i<count; i++) { dispatch_group_async(fetchGroup, fetchQ, ^(void) { dispatch_semaphore_wait(downloadSema, DISPATCH_TIME_FOREVER); NSURLConnection *loginConnection = [[NSURLConnection alloc] initWithRequest:requestArray[i] delegate:self]; dispatch_semaphore_signal(downloadSema); }); } // Now we wait until ALL our dispatch_group_async are finished. dispatch_group_wait(fetchGroup, DISPATCH_TIME_FOREVER); // Update your UI dispatch_sync(dispatch_get_main_queue(), ^{ [self updateUIFunction]; }); // Release resources dispatch_release(fetchGroup); dispatch_release(downloadSema); dispatch_release(fetchQ); 

Vous pouvez créer un dispatch_group_t , puis utiliser dispatch_group_notify pour exécuter updateUIFunction lorsque le bloc précédent du groupe a fini de s'exécuter, par exemple:

 dispatch_queue_t fetchQ = dispatch_queue_create("Featured Doc Downloader", NULL); dispatch_async(fetchQ, ^{ dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{ [self myAsyncMultipleURLRequestFunction]; }); dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{ dispatch_async(dispatch_get_main_queue(), ^{ [self updateUIFunction]; }); }); }); 

Première configuration boucle d'exécution.

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSURLRequest* request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10]; [NSURLConnection connectionWithRequest:request delegate:self]; while(!self.finished) { [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; } }); 

Essaye ça