2016-11-02 44 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

是的,謝謝你,我明白我的錯誤。 –

相關問題