無標題文章 --開始寫寫關于iOS的東西

蘋果的多線程

1,nsthread和gcd,nsoperation

(1)nsthread每個nsthread對象對應一個線程,量級較輕(真正的多線程)

(2)gcd和nsoperation是蘋果專門開發(fā)的“并發(fā)”技術,使程序員可以不再關心線程的具體使用問題,nsoperation和nsoperationqueue是面向對象的線程技術,gcd(grand central dispatch --派發(fā))是基于c語言的框架,可以充分利用多核,是蘋果推薦使用的多線程技術。 ?以上三種編碼方式從上倒下,抽象層次是從低到高的,抽象度越高的使用就越簡單,也是蘋果最推薦的多線程技術。

2,三種多線程技術的對比

(1)nsthread 優(yōu)點 ?輕量級,使用簡單 。 缺點 需要自己管理線程的生命周期,線程同步,加鎖,睡眠以及喚醒等。線程同步對數(shù)據(jù)的加鎖會有一定的系統(tǒng)開銷

(2)nsoperation 不需要關心線程的管理,數(shù)據(jù)同步的事情,可以把精力放在自己需要執(zhí)行的操作上 ? 面向對象的

(3)gcd ?grand central dispatch 是由蘋果開發(fā)的一個多核編程的解決方案 iOS4.0之后使用,是替代nsthread和nsoperation的高效的強大多技術,基于c語言的

3,多線程的實現(xiàn)

(1)nsthread的實現(xiàn)

? ? ?類方法直接開啟后臺線程,并執(zhí)行選擇器方法 detachNewThreadSelector

//新建一個線程,調用@selector 方法2 3?

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

2>成員方法,在實例化線程對象之后,需要使用start執(zhí)行選擇器方法

initWithTarget

//成員方法NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(bigDemo)object:nil];//啟動start線程[thread start];

對于NSThread的簡單使用,可以用NSObject的performSelectorInBackground替代

1// performSelectorInBackground是將bigDemo的任務放在后臺線程中執(zhí)行23[self performSelectorInBackground:@selector(bigDemo) withObject:nil];

同時,在NSThread調用的方法中,同樣要使用autoreleasepool進行內存管理,否則容易出現(xiàn)內存泄露。

1//自動釋放池23//負責其他線程上的內存管理,在使用NSThread或者NSObject的線程方法時,一定要使用自動釋放池45//否則容易出現(xiàn)內存泄露。67@autoreleasepool {891011}

3.2 NSOperation,面向對象的多線程技術

1>使用步驟:

1)實例化操作

1//實例化操作隊列2_queue = [[NSOperationQueue alloc] init];

a) NSInvocationOperation

1NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(opAction)object:nil];23//如果使用start,會在當前線程啟動操作4//[op1 start];56// 1.一旦將操作添加到操作隊列,操作就會啟動7[_queue addOperation:op1];

b) NSBlockOperation

1#pragmamark模仿下載網(wǎng)絡圖像2- (IBAction)operationDemo3:(id)sender3{4// 1.下載5NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{6NSLog(@"下載%@", [NSThread currentThread]);7}];8// 2.濾鏡9NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{10NSLog(@"濾鏡%@", [NSThread currentThread]);11}];12// 3.顯示13NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{14NSLog(@"更新UI %@", [NSThread currentThread]);15}];1617//添加操作之間的依賴關系,所謂“依賴”關系,就是等待前一個任務完成后,后一個任務才能啟動18//依賴關系可以跨線程隊列實現(xiàn)19//提示:在指定依賴關系時,注意不要循環(huán)依賴,否則不工作。20[op2 addDependency:op1];21[op3 addDependency:op2];22//[op1 addDependency:op3];2324[_queue addOperation:op1];25[_queue addOperation:op2];26[[NSOperationQueue mainQueue] addOperation:op3];27}

2)將操作添加到隊列NSOperationQueue即可啟動多線程執(zhí)行

1[_queue addOperation:op1];2[_queue addOperation:op2];

2>更新UI使用主線程隊列

//兩方式[NSOpeationQueue mainQueue] addOperation^{};[[NSOperationQueue mainQueue] addOperation:op3];

3>操作隊列的setMaxConcurrentOperationCount

可以設置同時并發(fā)的線程數(shù)量!

1//控制同時最大并發(fā)的線程數(shù)量2[_queue setMaxConcurrentOperationCount:2];

提示:此功能僅有NSOperation有!

4>使用addDependency可以設置任務的執(zhí)行先后順序,同時可以跨操作隊列指定依賴關系

1//添加操作之間的依賴關系,所謂“依賴”關系,就是等待前一個任務完成后,后一個任務才能啟動23//依賴關系可以跨線程隊列實現(xiàn)45//提示:在指定依賴關系時,注意不要循環(huán)依賴,否則不工作。6[op2 addDependency:op1];7[op3 addDependency:op2];8[op1 addDependency:op3];

提示:在指定依賴關系時,注意不要循環(huán)依賴,否則不工作。

3.3. GCDC語言

GCD就是為了在“多核”上使用多線程技術

1>要使用GCD,所有的方法都是dispatch開頭的

2>名詞解釋

global全局

queue隊列

async異步

sync同步

3>要執(zhí)行異步的任務,就在全局隊列中執(zhí)行即可

dispatch_async異步執(zhí)行控制不住先后順序

4>關于GCD的隊列

全局隊列dispatch_get_global_queue

參數(shù):優(yōu)先級DISPATCH_QUEUE_PRIORITY_DEFAULT

始終是0

1dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

可同步可異步

串行隊列

dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);

是創(chuàng)建得到的,不能直接獲取

只能同步

主隊列dispatch_get_main_queue

1dispatch_async(dispatch_get_main_queue(), ^{2NSLog(@"main - > %@", [NSThread currentThread]);3});

只能同歩

5>異步和同步與方法名無關,與運行所在的隊列有關!

同步主要用來控制方法的被調用的順序

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容