Ios 在执行dispatch\u信号量\u wait(sem,dispatch\u TIME\u FOREVER)之后,永远不会收到回调

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

我正在尝试等待我的rest服务回拨接收,但在

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响应完成时调用。不允许用户返回值。:)