2015-03-31 30 views
0

我在Objective c中做了一個應用程序,通過HTTP請求從服務器接收和發送數據。它工作正常,但當我連接到學校的互聯網應用程序凍結。我認爲wifi太慢了,我想創建一個新線程並拋出一個HTTP請求,並保持線程一直活動,直到應用程序連接完成,因此它不會與主接口發生衝突。是否值得在新線程中運行HTTP請求?

問題是我不太熟悉線程,我想知道是否值得這樣做。

+0

不僅值得...我會說非常需要。 [Check out this](https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/index.html#//apple_ref/occ/clm/NSURLConnection/sendAsynchronousRequest: queue:completionHandler :)它可以讓GCD爲你工作。 – danh 2015-03-31 18:25:42

回答

0

Facebook提供了一個用於處理HTTP請求的異步非阻塞API。我們希望能夠等待HTTP請求返回結果。具體而言,我們正在向Facebook發起活動,並且我們想知道我們剛發佈的活動的FacebookEventID。

爲了做到這一點,我們創建了一個變量「postRequestReturned」並將其設置爲false。在post函數中,只要「postRequestRetured」爲false,我們就發送請求並阻塞線程。這裏需要注意的一點是,一個簡單的while循環導致阻塞主線程並使應用程序無法接收來自Facebook的響應。相反,我們在目標c中使用了Runloop庫, Runloop是您的線程輸入並用於運行事件處理程序以響應傳入事件的循環。一些好的單證

Wait for code to finish execution

https://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

我們使用

while(!postRequestReturned){ 

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 

} 

在爲Facebook請求完成處理程序的代碼片段中,我們的postRequestReturned變量設置爲true。

禮貌: Wait for HTTP request to finish in obejective-c for iOS

+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – danh 2015-03-31 18:28:46

+0

我同意你丹..謝謝..更新我的答案與鏈接的細節。 – Iqbal 2015-03-31 18:38:10

0

使用異步API的

[NSURLConnection sendAsynchronousRequest:] 

[[NSURLConnection alloc] initWithRequest:m_webRequest delegate:self startImmediately:YES] 

一個異步調用是不會阻止你的主線程執行該Web請求調用。

相關問題