IOS下使用多執行緒

子非あ魚發表於2013-09-10

ios有三種主要方法:1NSThread2NSOperation3GCD

 

1、  NSThread

呼叫方法如下:如果需要函式引數的話,可以通過Object傳遞。

1.1:[NSThread detachNewThreadSelector:@selector(threadInMainMethod:) toTarget:selfwithObject:nil];

 

1.2:NSThread* myThread = [[NSThread alloc] initWithTarget:selfselector:@selector(threadInMainMethod:) object:nil];

 [myThread start]; 

1.3:  [obj performSelectorInBackground:@selector(threadMe) withObject:nil];

 

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的使用:

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. 通常是指程式設計師生成的,比如:

 

NSDate *da = [NSDate date];

NSString *daStr = [da description];

const char *queueName = [daStr UTF8String];

dispatch_queue_t myQueue = dispatch_queue_create(queueName, NULL);

3. Concurrent queue(global dispatch queue):

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

所以我們可以大致瞭解使用GCD的框架:

dispatch_async(getDataQueue,^{

    //獲取資料,獲得一組後,重新整理UI.

    dispatch_aysnc (mainQueue, ^{

    //UI的更新需在主執行緒中進行

};

}

)

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

 

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

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

相關文章