J'essaie de mettre en œuvre des demandes d'URL asynchrones dans une fonction particulière, je souhaite que toutes ces demandes complètent puis effectuent une action particulière, mais l'action précède les demandes, c'est-à-dire qu'elle est appelée avant les demandes terminées.
[_operationQ addOperationWithBlock: ^ { for (int i=0; i<count; i++) { NSURLConnection *loginConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; } } [[NSOperationQueue mainQueue] addOperationWithBlock: ^ { // updating UI [self updateUIFunction]; }]; }];
3 Réponses :
Vous pouvez créer un Dispatch_group_t code>, puis utiliser
Dispatch_group_notify code> pour exécuter le
up up up upnumifunction code> lorsque le bloc précédent de la finition du groupe exécuté, par exemple:
Merci va essayer cela et vous le faire savoir!
Hey @tkanzakic, cela ne fonctionne pas, comme avant. up up userncunction est appelé avant que MyasyncMultiPleurLreQuestCunction est terminée.
J'ai fabriqué une petite modification du bloc code> DisPatch_group_notify code>, je me souviens que je dois la mettre en œuvre de cette façon est un projet, le donner un essai
À propos, vos connexions fonctionnent-elles de manière asynchrone?
Oui, toutes les connexions sont asynchrones.
C'est la raison pour laquelle cela ne fonctionne pas (et cette manière ne sera pas possible d'accomplir cela), le Dispatch_group_notify code> attendre la fin de la méthode
myASYNCMULTIPLEURLREQUESTFunction code> mais pas pour les téléchargements . Pour résoudre ce problème, vous pouvez essayer de créer un rappel dans votre délégué de connexions
Je suppose que vous avez maintenant le contexte, j'ai une liste de connexions et je ne pense pas que la création de rappels pour chaque connexion est une approche viable. Y a-t-il une autre façon de le faire?
Toute votre connexion partage le délégué?, vous pouvez vérifier quand tous sont terminés, puis appellent la fonction de votre fonction de rappel (délégué).
Comment vérifier si tous les O'em ont terminé ??.
Vous connaissez le nombre de nsurlconnection code> vous exécutez, créez un numéro de propriété localOfconnectionfinfin et dans la méthode
ConnectionDidfinishloading: code> Augmentez sa valeur, vous devrez l'avoir fait dans le
Connexion: Didfailwitherror: Code> Pour le cas, une partie de votre connexion échoue
première boucle d'exécution de configuration.
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]]; } });
qu'entendez-vous par soi-même? Est-ce un bool ??
@tkanzakic est sur le bon chemin. La construction correcte à utiliser est la 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 asynchronés et vous assurer que vous n'avez pas trop de courir simultanément. Voici un échantillon de code qui illustre la manière dont vous devriez 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);
Je vais essayer cela, semble prometteur.