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方法。