3

AFHTTPSessionManager GET: ... не выполняет блоки, когда группа отправки ждет. dispatch_group_wait ждет действительно «НАВСЕГДА». В моем коде @ «все сделано» никогда не бывает.AFNetworking 3.1.0 и группы отправки

Как я могу заставить его работать?

(извините, как я вижу, большинству людей интересно узнать причину использования групп отправки здесь. Причина заключается в выполнении запросов в цикле и ожидании получения последнего ответа. Я намеренно не показывал свой цикл в коде , поскольку цикл не влияет, что блоки не выполняются)

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

хмм я не думаю, что это то, что dispatch_group предназначен для (в частности, как это), то вы, вероятно, следует с помощью dispatch_semaphore вместо – Fonix

+0

я не в состоянии понять, что такое использование 'dispatch_group' здесь ? не могли бы вы объяснить, что вам нужно здесь? почему вы используете 'dispatch_group'? – CodeChanger

+0

лучше, если вы используете dispatch_group_notify – Andrea

ответ

1

Во-первых: Вы не хотите ждать, и блокировать основной поток.

Актуальная проблема: вы создаете тупик. Вы можете использовать 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") 
}) 

Это не имеет смысла, хотя, как вы можете архивировать один и тот же результат без отправки групп, которые я настоятельно рекомендую:

[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"); 
}]; 

Если вы действительно хотите подождать, используйте этот подход ACH:

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

извините. Я должен был объяснить причину использования dispatch_groups –