Ios 在执行dispatch\u信号量\u wait(sem,dispatch\u TIME\u FOREVER)之后,永远不会收到回调
我正在尝试等待我的rest服务回拨接收,但在Ios 在执行dispatch\u信号量\u wait(sem,dispatch\u TIME\u FOREVER)之后,永远不会收到回调,ios,objective-c,Ios,Objective C,我正在尝试等待我的rest服务回拨接收,但在 dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); 电话线,一切都停止了,我再也没有接到回电。我的代码如下 __block NSString *strTaggedText=@""; dispatch_semaphore_t sem; sem = dispatch_semaphore_create(0); [[manager2 dataTaskWithRequest:req compl
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
电话线,一切都停止了,我再也没有接到回电。我的代码如下
__block NSString *strTaggedText=@"";
dispatch_semaphore_t sem;
sem = dispatch_semaphore_create(0);
[[manager2 dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
if (!error) {
NSLog(@"Reply JSON: %@", responseObject);
dictionary=[responseObject objectForKey:@"****"];
strTaggedText=[dictionary objectForKey:@"Text"];
NSLog(@"strText = %@",strTaggedText);
} else
{
NSLog(@"Error: %@, %@, %@", error, response, responseObject);
}
dispatch_semaphore_signal(sem);
}] resume];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
return strTaggedText;
您已停止主运行循环,这意味着不会处理任何事件,应用程序将停止响应 您正在调用一个异步方法,主线程可能会在显示忙碌指示器后立即返回 处理意味着从块内继续,块将在后台线程中调用。然后,您可以将数据推送到预期的位置,并取消忙碌指示灯。接下来的事情可能会在主线程上触发,但这取决于你;当然,任何UI交互都必须仅在主线程上完成
这是,但在我看来,完整的讨论超出了stackoverflow回答的范围。这根本不起作用的原因是你写了
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
在主线程上,主线程就停在那里,直到出现一个_信号——这个信号不会到达,因为你的manager2永远不会到达它恢复数据任务的代码 好吧,这是有道理的。谢谢。不使用信号量的另一种方法是,使用callbackHandler更改您的方法:字符串参数的^(NSString*strtagedtext){},并在API响应完成时调用。不允许用户返回值。:)