2016-11-02 42 views
1

我想等到我的休息服务回电接受,但经过后执行dispatch_semaphore_wait(SEM,DISPATCH_TIME_FOREVER)永远不会收到回调

dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); 

线,万物停下来,我从来没有收到回电。我的代码如下。

__block NSString *[email protected]""; 

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

只是一个不使用信号量的方法,使用callback yourMethodWithCallbackHandler更改方法:^(NSString * strTaggedText){}字符串参数并调用API响应完成。不要用户返回值。:) – kaushal

回答

1

您已停止主循环,这意味着没有事件正在处理,应用程序将停止响应。

要调用一个异步方法和主线程有望立即返回,或许呈现出繁忙的指示后。

处理是指从块,这将在后台线程中被称为内继续。然后,您可以将数据推送到预期要去的地方并取消繁忙指示符。 接下来的事情可以被触发,也许在主线程中,但这取决于你;当然,任何UI交互只能在主线程上完成。

这是asynchronous programming,而是一个完整的讨论超出了一个计算器答复的范围,在我看来。

+0

好的,这是有道理的。谢谢。 –

1

其原因,这是不是在所有的工作是你的主线程上写道

dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); 

,并在主线程就停在那里,直到一个_signal来 - 这不会因为你的manager2到达将从未达到恢复数据任务的代码。

+0

是的,谢谢你,我明白我的错误。 –

相关问题