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