iOS_多線程

NSThread

NSThread是輕量級的多線程開發(fā),使用起來也并不復雜滑频,但是使用NSThread需要自己管理線程生命周期腺逛。

NSthread的初始化

  • 動態(tài)方法
- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;  

// 初始化線程  
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];  
// 設置線程的優(yōu)先級(0.0 - 1.0著拭,1.0最高級)  
thread.threadPriority = 1;  
// 開啟線程  
[thread start];  

參數解析:
selector :線程執(zhí)行的方法纱扭,這個selector最多只能接收一個參數target :selector消息發(fā)送的對象argument : 傳給selector的唯一參數,也可以是nil

  • 靜態(tài)方法
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;  

[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];  
// 調用完畢后茫死,會馬上創(chuàng)建并開啟新線程  
  • 隱式創(chuàng)建線程的方法
[self performSelectorInBackground:@selector(run) withObject:nil];  

獲取當前線程

NSThread *current = [NSThread currentThread];  

獲取主線程

NSThread *main = [NSThread mainThread];  

暫停當前線程

// 暫停2s  
[NSThread sleepForTimeInterval:2];  

// 或者  
NSDate *date = [NSDate dateWithTimeInterval:2 since Date:[NSDate date]];  
[NSThread sleepUntilDate:date];  

線程間的通信

  • 在指定線程上執(zhí)行操作
  [self performSelector:@selector(run) onThread:thread withObject:nil waitUntilDone:YES];  
  • 在主線程上執(zhí)行操作
[self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES];  
  • 在當前線程執(zhí)行操作
[self performSelector:@selector(run) withObject:nil];  

優(yōu)缺點

1.優(yōu)點:NSThread比其他兩種多線程方案較輕量級跪但,更直觀地控制線程對象
2.缺點:需要自己管理線程的生命周期,線程同步峦萎。線程同步對數據的加鎖會有一定的系統(tǒng)開銷

NSOperation

使用NSOperation和NSOperationQueue進行多線程開發(fā)類似于 java 中的線程池,只要將一個NSOperation(實際開中需要使用其子類NSInvocationOperation忆首、NSBlockOperation)放到NSOperationQueue這個隊列中線程就會依次啟動爱榔。NSOperationQueue負責管理、執(zhí)行所有的NSOperation糙及,在這個過程中可以更加容易的管理線程總數和控制線程之間的依賴關系详幽。

NSOperation有兩個常用子類用于創(chuàng)建線程操作:NSInvocationOperation和NSBlockOperation,兩種方式本質沒有區(qū)別浸锨,但是是后者使用Block形式進行代碼組織唇聘,使用相對方便。

NSInvocationOperation *invocationOperation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(loadImage) object:nil]; 
//創(chuàng)建完NSInvocationOperation對象并不會調用柱搜,它由一個start方法啟動操作迟郎,但是注意如果直接調用start方法,則此操作會在主線程中調用聪蘸,一般不會這么操作,而是添加到NSOperationQueue中
// [invocationOperation start]; 
//創(chuàng)建操作隊列 
NSOperationQueue *operationQueue=[[NSOperationQueue alloc]init]; 
//注意添加到操作隊后宪肖,隊列會開啟一個線程執(zhí)行此操作    
[operationQueue addOperation:invocationOperation];


NSBlockOperation *blockOperation=[NSBlockOperation blockOperationWithBlock:^{
    [self loadImage];
}];

1.使用NSBlockOperation方法,所有的操作不必單獨定義方法健爬,同時解決了只能傳遞一個參數的問題控乾。
2.調用主線程隊列的addOperationWithBlock:方法進行UI更新,不用再定義一個參數實體(之前必須定義一個KCImageData解決只能傳遞一個參數的問題)娜遵。
3.使用NSOperation進行多線程開發(fā)可以設置最大并發(fā)線程蜕衡,有效的對線程進行了控制(上面的代碼運行起來你會發(fā)現(xiàn)打印當前進程時只有有限的線程被創(chuàng)建,如上面的代碼設置最大線程數為5设拟,則圖片基本上是五個一次加載的)

GCD

// 獲取默認優(yōu)先級的全局并發(fā)dispatch queue
dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

// 串行隊列
dispatch_queue_t queue2 = dispatch_queue_create("test", NULL);

dispatch_async(queue1, ^{
    NSLog(@"開啟了一個異步任務慨仿,當前線程:%@", [NSThread currentThread]);
});

dispatch_sync(queue2, ^{
    NSLog(@"開啟了一個同步任務鸽扁,當前線程:%@", [NSThread currentThread]);
});

并發(fā)隊列同樣是使用dispatch_queue_create()方法創(chuàng)建,只是最后一個參數指定為DISPATCH_QUEUE_CONCURRENT進行創(chuàng)建镶骗,但是在實際開發(fā)中我們通常不會重新創(chuàng)建一個并發(fā)隊列而是使用dispatch_get_global_queue()方法取得一個全局的并發(fā)隊列

  • 其他任務執(zhí)行方法

GCD執(zhí)行任務的方法并非只有簡單的同步調用方法和異步調用方法桶现,還有其他一些常用方法:

dispatch_apply():重復執(zhí)行某個任務,但是注意這個方法沒有辦法異步執(zhí)行(為了不阻塞線程可以使用dispatch_async()包裝一下再執(zhí)行)鼎姊。
dispatch_once():單次執(zhí)行一個任務骡和,此方法中的任務只會執(zhí)行一次,重復調用也沒辦法重復執(zhí)行(單例模式中常用此方法)相寇。
dispatch_time():延遲一定的時間后執(zhí)行慰于。
dispatch_barrier_async():使用此方法創(chuàng)建的任務首先會查看隊列中有沒有別的任務要執(zhí)行,如果有唤衫,則會等待已有任務執(zhí)行完畢再執(zhí)行婆赠;同時在此方法后添加的任務必須等待此方法中任務執(zhí)行后才能執(zhí)行。(利用這個方法可以控制執(zhí)行順序佳励,例如前面先加載最后一張圖片的需求就可以先使用這個方法將最后一張圖片加載的操作添加到隊列休里,然后調用dispatch_async()添加其他圖片加載任務)
dispatch_group_async():實現(xiàn)對任務分組管理,如果一組任務全部完成可以通過dispatch_group_notify()方法獲得完成通知(需要定義dispatch_group_t作為分組標識)赃承。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末妙黍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瞧剖,更是在濱河造成了極大的恐慌拭嫁,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抓于,死亡現(xiàn)場離奇詭異做粤,居然都是意外死亡,警方通過查閱死者的電腦和手機捉撮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門怕品,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呕缭,你說我怎么就攤上這事堵泽。” “怎么了恢总?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵迎罗,是天一觀的道長。 經常有香客問我片仿,道長纹安,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮厢岂,結果婚禮上光督,老公的妹妹穿的比我還像新娘。我一直安慰自己塔粒,他們只是感情好结借,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卒茬,像睡著了一般船老。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上圃酵,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天柳畔,我揣著相機與錄音,去河邊找鬼郭赐。 笑死薪韩,一個胖子當著我的面吹牛,可吹牛的內容都是我干的捌锭。 我是一名探鬼主播俘陷,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼舀锨!你這毒婦竟也來了岭洲?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤坎匿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后雷激,有當地人在樹林里發(fā)現(xiàn)了一具尸體替蔬,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年屎暇,在試婚紗的時候發(fā)現(xiàn)自己被綠了承桥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡根悼,死狀恐怖凶异,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情挤巡,我是刑警寧澤剩彬,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站矿卑,受9級特大地震影響喉恋,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一轻黑、第九天 我趴在偏房一處隱蔽的房頂上張望糊肤。 院中可真熱鬧,春花似錦氓鄙、人聲如沸馆揉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽升酣。三九已至,卻和暖如春蟋座,著一層夾襖步出監(jiān)牢的瞬間拗踢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工向臀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巢墅,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓券膀,卻偏偏與公主長得像君纫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芹彬,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容

  • 一蓄髓、前言 上一篇文章iOS多線程淺匯-原理篇中整理了一些有關多線程的基本概念。本篇博文介紹的是iOS中常用的幾個多...
    nuclear閱讀 2,053評論 6 18
  • 在這篇文章中舒帮,我將為你整理一下 iOS 開發(fā)中幾種多線程方案会喝,以及其使用方法和注意事項。當然也會給出幾種多線程的案...
    張戰(zhàn)威ican閱讀 603評論 0 0
  • 歡迎大家指出文章中需要改正或者需要補充的地方玩郊,我會及時更新肢执,非常感謝。 一. 多線程基礎 1. 進程 進程是指在系...
    xx_cc閱讀 7,197評論 11 70
  • 在這篇文章中,我將為你整理一下 iOS 開發(fā)中幾種多線程方案侦厚,以及其使用方法和注意事項耻陕。當然也會給出幾種多線程的案...
    伯恩的遺產閱讀 274,584評論 251 2,331
  • 最近玩了2次牛牛,過年期間大家玩牌的估計比較多刨沦,浙江這邊的可能比較清楚诗宣,就是5張撲克牌,三張湊成10的倍數已卷,剩下的...
    炒股牛閱讀 2,510評論 0 0