2009-11-10 116 views
9

我感到困惑同步NSUrlConnection和異步NSUrlConnection之間有什麼區別?有沒有同步或異步?如果我們在connectionDidFinishLoading方法中使用detachNewThreadSelector,是否爲 異步NSUrlConnection?這是最好的方法?任何教程...異步NSUrlConnection究竟意味着什麼?

回答

22

同步意味着你觸發你的NSURLConnection請求,並等待它完成。

異步意味着您可以觸發請求並執行其他操作,而NSURLConnection可以下載數據。

哪個「最好」?

同步是非常簡單的:你設置它,啓動它,並等待數據回來。但是,您的應用程序位於此處,不會執行任何操作,直到下載所有數據,發生錯誤或請求超時。如果您處理的不僅僅是少量的數據,您的用戶會坐在那裏等待,這不會帶來良好的用戶體驗。

異步只需要多一點工作,但用戶可以在請求執行其他操作時執行其他操作,這通常是比較好的選擇。您設置了一些委託方法,可以隨時跟蹤數據,這對於跟蹤下載進度很有用。這種方法對於大多數使用情況可能更好。

您可以使用NSURLConnection執行同步和異步請求。 Apple的documentation提供了對後一種方法所需的兩種方法和委託方法的清晰解釋。

+0

如何識別使用的連接同步還是異步?如果你看到下面的例子,你會告訴它使用了什麼嗎? http://developer.apple.com/iphone/library/samplecode/SeismicXML/ ?如果connectionWithRequest:delegate:引用異步,如果sendSynchronousRequest:returningResponse:error:引用同步,則某些示例在NSUrl連接中不會同時使用兩個....? – 2009-11-11 05:19:15

10

看來你在混合同步/異步連接和線程。在我的應用程序中,我使用異步連接作爲線程的替代方法。

假設您想要下載一個大文件而不會導致UI凍結。您有兩個基本選項:

  1. 異步連接。您從+ connectionWithRequest:delegate:(或其他非自動釋放選項之一)開始,它會下載文件的各個位,在有趣的事情發生時調用您的委託。 runloop仍在繼續,所以你的UI保持響應。當然,你必須小心,你的代表不要超出範圍。

  2. 同步。您開始與+ sendSynchronousRequest:returningResponse:error:的連接,但代碼會一直等到下載完成。你真的需要產生一個新的線程(或者Cocoa支持的一個更高級別的線程操作),否則UI將會被阻塞。

哪種選擇「最佳」或痛苦最少將取決於您的應用程序,你想達到什麼樣的架構。如果您需要爲長時間運行的流程創建線程,則可以使用第二個選項。一般來說,我會說第一個選項是最簡單的。

這一切都很好documented on Apple's Developer site

3

其他響應中未提及的內容是請求的大小。例如,如果您正在下載大文件,那麼使用異步連接會更好。您的代表將在他們到達時接收數據塊。相比之下,同步方法會在提供給您之前等待所有數據。委託可以更快地開始處理響應(更好的用戶體驗),或者將其保存到文件而不是內存(更好的資源使用情況)。您也可以選擇在不等待所有數據的情況下停止響應。

基本上,異步方法爲您提供了對連接的更多控制,但代價是複雜性。同步方法要簡單得多,但不應該在主UI線程上使用,因爲它會阻塞。

2

迴應關於文件大小的其他答案:我認爲文件大小並不重要。如果服務器的響應速度非常緩慢,並且您正在同步加載數據,那麼即使您正在加載少量數據(如3k),您的UI仍會凍結。

所以我會選擇在任何情況下的異步選項,因爲你永遠不知道你會得到什麼關於文件大小,服務器響應速度或網絡速度。