gpt4 book ai didi

ios - AFNetworking 3.1.0 和调度组

转载 作者:搜寻专家 更新时间:2023-10-30 20:24:16 25 4
gpt4 key购买 nike

AFHTTPSessionManager GET:... 在调度组等待时不执行它的 block 。 dispatch_group_wait 真的“永远”等待着。在我的代码中,@"all done"永远不会发生。

我怎样才能让它发挥作用?

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

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:

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

如果你真的想等,用这个方法:

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

关于ios - AFNetworking 3.1.0 和调度组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40148585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com