【问题标题】:AFNetworking 3.1.0 and dispatch groupsAFNetworking 3.1.0 和调度组
【发布时间】:2016-10-20 07:55:00
【问题描述】:

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

【问题讨论】:

  • 嗯,我认为这不是 dispatch_group 的用途(特别是这样),您可能应该改用 dispatch_semaphore
  • 我无法理解这里的dispatch_group 有什么用?你能解释一下你需要什么吗?为什么你使用dispatch_group
  • 如果你使用 dispatch_group_notify 会更好

标签: ios objective-c grand-central-dispatch dispatch afnetworking-3


【解决方案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")

【讨论】:

  • 对不起。我不得不解释使用 dispatch_groups 的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多