我在Objective c中做了一個應用程序,通過HTTP請求從服務器接收和發送數據。它工作正常,但當我連接到學校的互聯網應用程序凍結。我認爲wifi太慢了,我想創建一個新線程並拋出一個HTTP請求,並保持線程一直活動,直到應用程序連接完成,因此它不會與主接口發生衝突。是否值得在新線程中運行HTTP請求?
問題是我不太熟悉線程,我想知道是否值得這樣做。
我在Objective c中做了一個應用程序,通過HTTP請求從服務器接收和發送數據。它工作正常,但當我連接到學校的互聯網應用程序凍結。我認爲wifi太慢了,我想創建一個新線程並拋出一個HTTP請求,並保持線程一直活動,直到應用程序連接完成,因此它不會與主接口發生衝突。是否值得在新線程中運行HTTP請求?
問題是我不太熟悉線程,我想知道是否值得這樣做。
Facebook提供了一個用於處理HTTP請求的異步非阻塞API。我們希望能夠等待HTTP請求返回結果。具體而言,我們正在向Facebook發起活動,並且我們想知道我們剛發佈的活動的FacebookEventID。
爲了做到這一點,我們創建了一個變量「postRequestReturned」並將其設置爲false。在post函數中,只要「postRequestRetured」爲false,我們就發送請求並阻塞線程。這裏需要注意的一點是,一個簡單的while循環導致阻塞主線程並使應用程序無法接收來自Facebook的響應。相反,我們在目標c中使用了Runloop庫, Runloop是您的線程輸入並用於運行事件處理程序以響應傳入事件的循環。一些好的單證
Wait for code to finish execution
我們使用
while(!postRequestReturned){
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
在爲Facebook請求完成處理程序的代碼片段中,我們的postRequestReturned變量設置爲true。
使用異步API的
[NSURLConnection sendAsynchronousRequest:]
或
[[NSURLConnection alloc] initWithRequest:m_webRequest delegate:self startImmediately:YES]
一個異步調用是不會阻止你的主線程執行該Web請求調用。
不僅值得...我會說非常需要。 [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