我想等到我的休息服务回电接收,但是
之后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;
答案 0 :(得分:1)
您已停止主runloop,这意味着没有事件被处理,应用程序将停止响应。
您正在调用异步方法,并且在显示忙碌指示符之后,主线程应该立即返回。
处理意味着从块中继续,将在后台线程中调用。然后,您可以将数据推送到预期的位置并取消忙指示符。然后可以在主线程上触发接下来的事情,但这取决于你;当然,任何UI交互都必须仅在主线程上完成。
这是asynchronous programming,但在我看来,完整的讨论超出了stackoverflow答案的范围。
答案 1 :(得分:1)
这根本不起作用的原因是你写了
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
在主线程上,主线程停在那里直到_signal到来 - 它不会到达,因为你的manager2将永远不会到达恢复数据任务的代码。