Attendre jusqu'à ce que de multiples réseaux demandes ont toutes exécutées - y compris l'achèvement des blocs
J'ai de multiples opérations (ils sont AFNetworking demandes) avec l'achèvement des blocs qui prend un certain temps à s'exécuter, et une Base de Données de l'objet qui doit être sauvé à la fin de tous les les demandes.
MyCoreDataObject *coreDataObject;
AFHTTPRequestOperation *operation1 = [[AFHTTPRequestOperation alloc] initWithRequest:request1];
[operation1 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
coreDataObject.attribute1 = responseObject;
sleep(5);
}];
[operation1 start];
AFHTTPRequestOperation *operation2 = [[AFHTTPRequestOperation alloc] initWithRequest:request1];
[operation2 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
coreDataObject.attribute2 = responseObject;
sleep(10);
}];
[operation1 operation2];
[context save:nil];
Bien sûr, cela ne fonctionne pas comme je veux, parce que les demandes sont asynchrones. J'ai essayé d'ajouter un NSOperationQueue comme suit:
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
[operationQueue setMaxConcurrentOperationCount:2];
AFHTTPRequestOperation *operation1 = [[AFHTTPRequestOperation alloc] initWithRequest:request1];
[operation1 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
coreDataObject.attribute1 = responseObject;
sleep(5);
}];
[operationQueue addOperation:operation1];
AFHTTPRequestOperation *operation2 = [[AFHTTPRequestOperation alloc] initWithRequest:request1];
[operation2 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
coreDataObject.attribute2 = responseObject;
sleep(10);
}];
[operationQueue addOperation:operation2];
[imageQueue waitUntilAllOperationsAreFinished];
[context save:nil];
Cela ressemble un peu mieux. À l'aide de waitUntilAllOperationsAreFinished
, ma file d'attente bloque le thread courant jusqu'à ce que mes demandes sont finis, mais pas jusqu'à ce que mon succès Blocs sont finis, ce qui est vraiment ce dont j'ai besoin.
Aucune idée sur la façon d'atteindre cet objectif dans un bon chemin?
Vous devez vous connecter pour publier un commentaire.
Expédition d'utilisation de groupes.
dispatch_group_notify(group, queue, ^{ ... });
au lieu dedispatch_group_wait()
.dispatch_group_wait()
attend, depuis que bloque le thread et, si l'API n'est pas thread-safe, rien d'autre pourrait appelerdispatch_group_leave()
. Je vous suggère d'ouvrir une nouvelle question pour votre plante, fournissant le code et le plein rapport de crash.responseObjects
à un NSMutableArray pour la poursuite du traitement une fois toutes les requêtes ont fini. Auriez-vous besoin d'ajouter les appels à[array addObject:]
dans un@synchronized
bloc ou ce ne sera pas nécessaire?@synchronized
est l'un de ces mécanismes. Une série de file d'attente est une autre. Barrière de tâches sur un privé simultané de la file d'attente est une autre. Etc.AFHTTPRequestOperation
fonctionne sous le capot. Dans tous les cas, les blocs de ne pas entrer dans le groupe. Le groupe est entré (son compteur est incrémenté) avant que les blocs ne sont même créé, a fortiori, défini comme le gestionnaire d'achèvement, a fortiori invoquée. Les blocs de quitter le groupe (décrémenter) à la fin.AFNetworking a conçu la méthode pour ce genre d'opérations, qui fait abstraction de PGCD:
-enqueueBatchOfHTTPRequestOperationsWithRequests:progressBlock:completionBlock:
-enqueueBatchOfHTTPRequestOperations:progressBlock:completionBlock:
Prendre un coup d'oeil à FAQ
Je pense à quelque chose comme ceci:
référence aux docs: http://cocoadocs.org/docsets/AFNetworking/2.5.0/
Mes besoins étaient ceux de faire beaucoup de demande à partir d'un tableau de Chaîne de caractères (URL)
Évidemment, de cette façon, les appels sont effectués en cascade, pas de N appels asynchrones.