AFNetworking 3.1.0 и группы отправки

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

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

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

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");

person Андрей Шевцов    schedule 20.10.2016    source источник
comment
хм, я не думаю, что это то, для чего предназначена dispatch_group (в частности, вот так), вам, вероятно, следует использовать вместо этого dispatch_semaphore   -  person Fonix    schedule 20.10.2016
comment
Я не могу понять, при чем тут dispatch_group? не могли бы вы объяснить, что вам здесь нужно? почему вы используете dispatch_group ?   -  person CodeChanger    schedule 20.10.2016
comment
лучше, если вы используете dispatch_group_notify   -  person Andrea    schedule 20.10.2016


Ответы (1)


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

Актуальная проблема: вы создаете тупик. Вы можете использовать group.notify:

Объект-C:

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

Свифт 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");
 }];

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

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")
person shallowThought    schedule 20.10.2016
comment
Извините. Пришлось объяснять, зачем использовать dispatch_groups - person Андрей Шевцов; 25.10.2016