AFHTTPSessionManager GET:... 在调度组等待时不执行它的块。 dispatch_group_wait 真正等待“永远”。在我的代码中@"all done"从来没有发生过。

我怎样才能让它工作?

(抱歉。正如我所见,大多数人都想知道这里使用调度组的原因。原因是在循环中执行请求并等待获得最后一个响应。我故意没有在代码中显示我的循环,因为循环不影响块没有被执行)

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

最佳答案

第一:你不想等待和阻塞主线程。

实际问题:您正在创建一个死锁。您可以使用 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")

10-08 06:07