2012-02-27 15 views
0

需要你的幫助。在多線程的ios

在我的應用程序中,我想實現一個後臺進程,它可以持續運行並下載更新的數據並將其存儲在文檔文件夾中。

而我的主線程應該繼續檢查文檔文件夾並在視圖控件中顯示更新的數據。一旦視圖中消失

子線程應該結束。並在視圖出現後重新開始。

這樣做的最佳方法是什麼? NSThread或NSOperationQueue?需要採取哪些預防措施? 我也必須訪問該類的幾個變量。所以應該是線程安全的。

在此先感謝。

問候

+0

試過很多東西。但無法實現我的目標。任何人都可以請給我一些建議。我想創建一個將在後臺連續運行的線程。它會有一段時間(1)循環,我將重複下載10-20張圖像。下載將在線程中同步/異步完成。在異步調用中,我面臨的問題是,不調用成功/失敗回調函數。在同步通話中,我面臨的問題是,我無法在網址請求中發送用戶名和密碼。 – Nir 2012-03-03 10:01:54

回答

2


如果您不需要更新的iOS5進度條什麼的有一個很大的API方法+ sendAsynchronousRequest:queue:completionHandler:,允許您運行的異步下載作爲內部NSOperationQueue塊。如果不是你應該看看第三方庫,如ASIHTTP請求或https://github.com/AFNetworking/AFNetworking(可能會更好最後一個),或者你需要建立你自己的下載管理器,而不是一個簡單的任務

+0

感謝您的建議。我不只是想下載數據。但也必須在線程中完成其他任務。其次,它應該保持在後臺運行。你認爲sendAsynchronousRequest:queue:completionHandler:是做這件事的最好方法嗎? – Nir 2012-02-27 09:21:41

+0

好,取決於你需要做的事情與被下載時傳入的數據..它不是,因爲它只是給你機會做做在競爭中處理的東西。讓我舉個例子,你需要下載的文件真的很大。在這種情況下,你會選擇一個流或一個文件處理程序來添加數據,不僅在最後。我想你應該看看AFNetoworking,只是NSURLconnection方法的一個「簡單」包裝。 – Andrea 2012-02-27 09:36:56

+0

好的謝謝。將通過AFNetoworking。 – Nir 2012-02-27 10:03:10

0

有兩種方法可以做到這一點..

第一:你使用NSOperationQueue,它有點笨重,因爲它是建立在GCD上的,但確實有一些額外的功能。

第二:您使用GCD(grand central dispatch)查看需求我會說GCD看起來很好,因爲您可以輕鬆訪問任何線程(主或背景),這會稍微快一點。

+0

這將用於異步調用嗎? – Nir 2012-02-28 06:35:03

+0

異步背後的想法是在後臺線程中執行某些操作,以便它不會影響通常用於UI的主隊列。所以這就是這些的目的,爲你提供異步行爲。 – 2012-02-28 07:42:44

+0

不完全是,誤解了主線程中的所有NSURLConnection回調工作,您可以只放一個日誌詢問當前線程。如果不在輔助線程上創建運行循環,則該線程將永遠不會收到委託方法。異步連接不會阻塞主,因爲是異步,所以它將數據以塊的形式附加到運行循環的每個週期。此外,從代表團回撥中可以看出,他們不需要太多時間來完成。 NSOperationQueue自ioS4在新線程上運行所有操作,這意味着如果您不創建循環,則一切都會丟失 – Andrea 2012-02-28 08:14:37

0

你可以看看- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg這個方法在你的應用程序中創建一個新線程,如果你的應用程序還沒有進入多線程模式。在您的viewDidDisappear中,您可以在視圖消失時停止任務

從Apple Docs。 Apple鼓勵調查替代Mac OS X技術來實現併發。如果您尚不熟悉實現線程化應用程序所需的設計技術,那麼情況尤其如此。這些替代技術簡化了您爲實現併發執行路徑所做的工作量,並提供比傳統線程好得多的性能。 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/AboutThreads/AboutThreads.html#//apple_ref/doc/uid/10000057i-CH6-SW2

+0

爲了清楚起見,這將使用同步連接,對於異步連接,您將不會獲得直到連接完成。有一個新的線程並不意味着你的運行循環足夠活。 – Andrea 2012-02-27 14:26:36

+0

@Andrea我正面臨着這個問題。我在我的線程中使用異步調用。這是創造問題。那麼在線程中使用異步調用的最佳方式是什麼?我嘗試使用NSThread和GCD。在這兩種情況下,我面臨同樣的問題 – Nir 2012-02-28 06:31:53

+0

@Andrea現在我將嘗試NSOperation。 – Nir 2012-02-28 06:50:26