2012-12-11 54 views
2

我們正在編寫一個大量使用NSURLConnection的SDK。要管理所有這些連接(例如,大規模取消它們),最好是它們全部在單個線程(最好是主線程)上運行。由於NSURLConnection的異步特性,這並不是一個可怕的想法 - 在我們的獨立應用程序中,所有連接都在主線程上運行,並且在連接之後在輔助線程(實際上使用GCD或操作隊列)上執行繁重的工作結果得到了,沒有任何阻礙。什麼時候你想要在輔助線程上運行NSURLConnection?

所以問題是 - 在哪些情況下用戶想要在多個線程上運行連接,並且在不是主線程的線程上?

編輯:我想我沒有正確解釋自己。我們在異步中使用NSURLConnection,而不是同步時尚。這允許我們在主線程上運行所有連接而不會阻塞UI。問題是:我們SDK的用戶何時希望在異步和不同的線程上運行這些連接?

+0

使用[NSOperationQueue](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html)。它具有[取消操作]的屬性(https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html#//apple_ref/occ/instm/NSOperationQueue/cancelAllOperations) 。 – iDev

+0

每個'NSURLConnection'都不在後臺線程上運行嗎? – 2012-12-11 18:24:58

+0

sendSynchronousRequest:returningResponse:error方法阻止調用它的線程。 –

回答

1

我可以想象在另一個線程上運行異步NSURLConnection的唯一理由是如果您的委託方法本身非常耗時。即使如此,我仍然可能會在主線程上運行它,並將處理移動到背景隊列中。

編輯:請注意,今天「將處理移動到後臺線程」非常容易。在GCD之前,這有點困難,所以在輔助線程上運行NSURLConnection本身可能會更有用。當您將NSURLConnection嵌入到不在主線程中處理runloop的C++應用程序(這基本上僅適用於Mac應用程序)時,它仍然有點用處。

正如我相信你明白,NSURLConnection已經管理其內部使用自己的後臺線程。

總之,我相信你的直覺是正確的。答案是「幾乎從不」。 NSURLConnection在主線程中最容易管理。

+0

感謝您的輸入。我想等一會兒發表異議。如果它不存在,我會接受你的回答:-) –

+0

只是想到它仍然有用的一些情況.... –

+0

嗯,你想分享它們嗎? :-) –

1

當你有一個加載大量數據的請求,並且你確定它會很慢,並且你需要經常渲染一個GUI。
這種情況下,如果在主線程中更新GUI(如可可,GUI在主線程中更新),請求過慢可能會導致所有視圖停止顯示,因爲它們未更新。

也是蘋果文件說,這大約sendSynchronousRequest:returningResponse:錯誤:

重要提示:由於此調用有可能需要幾分鐘失敗(特別是使用iOS的蜂窩網絡時),你不應該調用這個函數來自GUI應用程序的主線程。

+0

感謝您的意見,但我相信存在誤解 - 請參閱我的修改。 –

+0

所以你從另一個線程調用它。如果這個線程做了重要的事情,而你又不想阻塞它,那麼你使用了一個異步請求。 –

相關問題