gpt4 book ai didi

iOS 停止 block 执行直到 block 完成

转载 作者:行者123 更新时间:2023-11-28 21:33:43 26 4
gpt4 key购买 nike

我在 iOS 应用程序中有一个方法,它应该根据网络调用是否成功返回一个 bool 值。

Web 调用的结构是将一个 block 作为回调参数,当 Web 调用有结果时调用该回调。基于该结果,我的方法需要返回一个 True/False 值。

因此,我需要在没有返回结果的情况下停止执行任何进一步的进展。

在查看了其他人分享的一些示例后,我正在尝试通过信号量实现此目的,但从未调用过回调,如果我删除信号量,则始终会调用回调。

我在这里错过了什么?

+ (BOOL)getUserInformation {
__block BOOL flag = false;

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

[[WebServicesManager sharedManager] getUserInformationWithCallback:^(NSInteger statusCode, NSString *response, NSDictionary *responseHeaders, id obj, NSError *error) {

if (error) {
//Handle error case and perform appropriate cleanup actions.
}
else
{
//Save user information
flag = true;
}

dispatch_semaphore_signal(semaphore);
}];

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

return flag;
}

我在 if(error) 上设置了一个断点来检查回调是否被调用,它没有,除非我删除信号量。

我可以给这个方法它自己的回调 block ,或者我可以给包含类一个委托(delegate)并实现我需要的,但我真的想让这个方法起作用。

最佳答案

WebServicesManager 可能正在信号量正在等待的同一线程上调度它的 block 。

正如@Rob 在评论中正确提到的那样,这很可能不是在主线程上做的好主意;而是使用异步模型,不要阻塞主线程可能几分钟,直到在某些情况下连接可能超时,从而卡住您的 UI。

关于iOS 停止 block 执行直到 block 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34764511/

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