执行dispatch_semaphore_wait(sem,DISPATCH_TIME_FOREVER)之后永远不会收到回调

时间:2016-11-02 11:28:30

标签: ios objective-c

我想等到我的休息服务回电接收,但是

之后
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;

2 个答案:

答案 0 :(得分:1)

您已停止主runloop,这意味着没有事件被处理,应用程序将停止响应。

您正在调用异步方法,并且在显示忙碌指示符之后,主线程应该立即返回。

处理意味着从块中继续,将在后台线程中调用。然后,您可以将数据推送到预期的位置并取消忙指示符。然后可以在主线程上触发接下来的事情,但这取决于你;当然,任何UI交互都必须仅在主线程上完成。

这是asynchronous programming,但在我看来,完整的讨论超出了stackoverflow答案的范围。

答案 1 :(得分:1)

这根本不起作用的原因是你写了

dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

在主线程上,主线程停在那里直到_signal到来 - 它不会到达,因为你的manager2将永远不会到达恢复数据任务的代码。