什麼是多線程 和GCD 的認識

IOS多線程

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

 

1、 NSThread

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

1.1:[NSThreaddetachNewThreadSelector:@selector(threadInMainMethod:)toTarget:self withObject:nil];

 

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

 [myThread start]; 

1.3:  [objperformSelectorInBackground:@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是Clevel的函數,這意味着它也提供了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相關的就要使用MainQueue.

2.Serial quque(private dispatch queue)

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

1

2

3

4

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(globaldispatch queue):

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

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

1

2

3

4

5

6

7

dispatch_async(getDataQueue,^{

    //獲取數據,獲得一組後,刷新UI.

    dispatch_aysnc(mainQueue, ^{

    //UI的更新需在主線程中進行

};

}

)

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

 

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章