3

AFHTTPSessionManager GET: ... n'effectue pas ses blocs lorsque le groupe de répartition attend. dispatch_group_wait attend vraiment "FOREVER". Dans mon code @ "tout fait" ne se produit jamais.AFNetworking 3.1.0 et les groupes de répartition

Comment puis-je le faire fonctionner?

(désolé, comme je vois, la plupart des gens sont intéressés de connaître la raison pour utiliser les groupes de dispatching ici.La raison est d'effectuer des demandes en boucle et attendez la dernière réponse est obtenu.J'ai intentionnellement montré ma boucle dans le code , parce que la boucle ne touche pas que les blocs ne sont pas effectués)

dispatch_group_t group = dispatch_group_create(); 

NSString *urlString = @"someURLForExampleReturnJSON"; 
dispatch_group_enter(group); 
[self.sessionManager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) 
{ 
    NSLog(@"success block execution"); 
    dispatch_group_leave(group); 
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
    NSLog(@"failure block execution"); 
    dispatch_group_leave(group); 
}]; 

dispatch_group_wait(group, DISPATCH_TIME_FOREVER); 
NSLog(@"all done"); 
+0

hmm je ne pense pas que c'est ce qu'un dispatch_group est destiné à (en particulier comme celui-ci), vous devriez probablement utiliser un dispatch_semaphore à la place – Fonix

+0

je ne suis pas en mesure de comprendre ce qui est l'utilisation de 'dispatch_group' ici ? Pouvez-vous s'il vous plaît expliquer ce dont vous avez besoin ici? Pourquoi utilisez-vous 'dispatch_group'? – CodeChanger

+0

mieux si vous utilisez dispatch_group_notify – Andrea

Répondre

1

Première: Vous ne voulez pas attendre et de bloquer le thread principal.

Problème actuel: Vous créez un interblocage. Vous pouvez utiliser group.notify:

Obj-C:

dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
    NSLog(@"all done"); 
}); 

Swift 3:

group.notify(queue: DispatchQueue.main, execute: { 
    print("all Done") 
}) 

Cela n'a pas de sens si, comme vous pouvez archiver le même résultat sans groupes d'expédition, que je recommande fortement:

[self.sessionManager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 
    NSLog(@"all done"); 
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
    NSLog(@"failure block execution"); 
}]; 

Si vous voulez vraiment attendre, utilisez ce haque:

import Foundation 

print("main start") 

let group = DispatchGroup() 
group.enter() 
// put your heavy task on background queue 
DispatchQueue.global(qos: .background).async { 
    print("background start") 
    sleep(2) // do some long running task 
    print("background stop") 
    group.leave() 
} 

// wait on main queue 
group.wait() 
print("go on") 
+0

désolé. Je devais expliquer la raison pour laquelle utiliser dispatch_groups –