今天,咱們就來講一下iOS多線程的問題,爲何要使用iOS多線程?由於一個應用程序在一個時間內可能有一個唄或者多任務,咱們不可能都放在主線程當中執行,這樣會大大的下降程序的運行效率.因此就須要用到多線程的.多線程
多線程的優勢能適當提升程序的執行效率能適當提升資源利用率(CPU、內存利用率)延緩內存使用高峯的到來
而後,咱們就說一下如今iOS當中人們主要使用到多線程技術.一共是4種,分別是NSObject,NSThread,NSOperation,以及CGD.併發
NSObject
(1)NSObject建立多線程的方式比較簡單,只有一個方法.就是使用performSelectorInBackground:withObject: 的方式建立多線程app
[Obj performSelectorInBackground:@selector(doSomething) withObject:nil]; [Obj performSelectorOnMainThread:@selector(doSomethingOnMainThread:) withObject:image waitUntilDone:YES];
doSomething:在這個自定義的方法內,寫本身想要作的事情.doSomethingOnMainThread:在這個方法中咱們寫返回到主線程所作的事情,好比刷新UI等等.async
NSThread
(2)相對於其餘兩種,NSThread 是一種輕量級的多線程.建立NSThread 有兩種方式,一種對象建立方式,一種是類建立方式.對象建立方式當中咱們須要手動啓動線程,可是類建立方式中,咱們不須要手動啓動線程,系統回自動幫助咱們啓動線程.優化
- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument + (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil]; NSThread* testThead = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil]; [testThead start];
NSOperation
(3)NSOperation類是一個抽象的類,咱們通常不使用NSOperation,而是使用他的子類NSInvocationOperation和NSOperationQueue.
NSInvocationOperation:這是由系統定義的NSOperation的子類,省去了繼承的代碼,使用該類能夠方便的制定操做對象,方法.NSOperationQueue:這是Operation對象的管理者,OperationQueue負責執行放入其中的全部操做對象.spa
NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationAction:) object:myObject]; NSOperationQueue *queue = [[NSOperationQueue alloc]init]; [queue addOperation:operation];
注意:operationAction:線程的方法,參數就是myObject!!!線程
GCD
(4)Grand Central Dispatch 簡稱(GCD)是蘋果公司開發的技術,以優化的應用程序支持多核心處理器和其餘的對稱多處理系統的系統。這創建在任務並行執行的線程池模式的基礎上的。它首次發佈在Mac OS X 10.6 ,iOS 4及以上也可用。code
//block塊建立多線程,而且回到主線程刷新UI dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 子線程操做..... dispatch_async(dispatch_get_main_queue(), ^{ //返回主線程, 更新UI界面 }); });
而後咱們就說一下,咱們在GCD中使用的多線程分類dispatch_group_async(分組線程) ,dispatch_barrier_async(順序線程),dispatch_apply (重複線程)
dispatch_group_async能夠實現監聽一組任務是否完成,完成後獲得通知執行其餘的操做orm
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{ NSLog(@"group1"); //分組線程任務1 }); dispatch_group_async(group, queue, ^{ NSLog(@"group2"); //分組線程任務2 }); dispatch_group_async(group, queue, ^{ NSLog(@"group3"); //分組線程任務3 }); dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"updateUi"); //主線程任務 }); dispatch_release(group);
注意:在dispatch_group_async當中,全部線程任務都是併發執行的,沒有前後順序,可是如上面的代碼當中只有當分組線程任務完成的時候,主線程任務纔會執行。
dispatch_barrier_async是在前面的任務執行結束後它才執行,並且它後面的任務等它執行完成以後纔會執行對象
dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ NSLog(@"dispatch_async1"); //子線程任務1 }); dispatch_async(queue, ^{ NSLog(@"dispatch_async2"); //子線程任務2 }); dispatch_barrier_async(queue, ^{ NSLog(@"dispatch_barrier_async"); //順序線程任務 }); dispatch_async(queue, ^{ NSLog(@"dispatch_async3"); //子線程任務3 });
子線程任務1和子線程任務2執行完成可能有所不一樣,可是子線程任務1和子線程任務2必定在順序線程任務以前,當順序線程任務執行完成以後,子線程任務3纔會執行.
dispatch_apply(3, globalQ, ^(size_t index) { // 執行3次block中的代碼 });
文/Ashoka_APP(簡書做者) 原文連接:http://www.jianshu.com/p/2e6606bc0ae9 著做權歸做者全部,轉載請聯繫做者得到受權,並標註「簡書做者」。