天天看點

iphone-多線程(NSThread)

//網絡資源

//from: http://blog.sina.com.cn/s/blog_91550f4b01011d5u.html

[size=small]

//

IOS多線程

ios有三種主要方法:1、NSThread。2、NSOperation。3、GCD。

1、 NSThread:

調用方法如下:如果需要函數參數的話,可以通過Object傳遞。

[/size]

1.1:

1.2:

1.3:

[size=small]

2、 NSOperation:

NSOperation也是多線程的一種,NSOpertaion有2種形式.

(1) 并發執行

并發執行你需要重載如下4個方法

//執行任務主函數,線程運作的入口函數

- (void)start

//是否允許并發,傳回YES,允許并發,傳回NO不允許。預設傳回NO

-(BOOL)isConcurrent

- (BOOL)isExecuting

//是否已經完成,這個必須要重載,不然放在放在NSOperationQueue裡的NSOpertaion不能正常釋放。

- (BOOL)isFinished

比如TestNSOperation:NSOperaion 重載上述的4個方法,

聲明一個NSOperationQueue, NSOperationQueue *queue = [[[NSOperationQueue alloc ] init] autorelease];

[queue addOperation:testNSoperation];

它會自動調用TestNSOperation裡的 start函數,如果需要多個NSOperation,你需要設定queue的一些屬性,如果多個NSOperation之間有依賴關系,也可以設定,具體可以參考API 文檔。

(2)非并發執行

-(void)main

隻需要重載這個main方法就可以了。

3、 GCD

GCD很強大,我的使用經驗很少。但是scorpiozj 總結的比較全面(http://www.cnblogs.com/scorpiozj/archive/2011/07/25/2116459.html)

同時,這篇文章也介紹的比較詳細 http://www.cnblogs.com/vinceoniphone/archive/2011/04/07/2007968.html

官方教程

GCD是和block緊密相連的,是以最好先了解下block(可以檢視這裡).GCD是C level的函數,這意味着它也提供了C的函數指針作為參數,友善了C程式員.

下面首先來看GCD的使用:

1

dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

async表明異步運作,block代表的是你要做的事情,queue則是你把任務交給誰來處理了.(除了async,還有sync,delay,本文以async為例).

之是以程式中會用到多線程是因為程式往往會需要讀取資料,然後更新UI.為了良好的使用者體驗,讀取資料的操作會傾向于在背景運作,這樣以避免阻塞主線程.GCD裡就有三種queue來處理。

1. Main queue:

  顧名思義,運作在主線程,由dispatch_get_main_queue獲得.和ui相關的就要使用Main Queue.

2.Serial quque(private dispatch queue)

  每次運作一個任務,可以添加多個,執行次序FIFO. 通常是指程式員生成的,比如:

[/size]

[size=small]

3. Concurrent queue(global dispatch queue):

可以同時運作多個任務,每個任務的啟動時間是按照加入queue的順序,結束的順序依賴各自的任務.使用dispatch_get_global_queue獲得.

是以我們可以大緻了解使用GCD的架構:

[/size]

[size=small]

由此可見,GCD的使用非常簡單,以我的使用經驗來看,以後會逐漸淘汰使用NSOperation而改用GCD。

[/size]

[color=red]

提個問題:如果某個ViewController裡運作了一個Thread,Thread還沒結束的時候,這個ViewController被Release了,結果會如何?

經過的的測試,Thread不結束,ViewController一直保留,不會執行dealloc方法。

[/color]

[/size]