iOS多線程 - NSTread詳解

前言

首先比較一下NSTread 和GCD浩考,NSOperation三者之間的優(yōu)缺點:

  • NSThread:
    NSThread 比其他兩個輕量級,使用簡單叉谜。但是需要自己管理線程的生命周期貌嫡、線程同步、加鎖檀咙、休眠以及喚醒等。線程同步對數(shù)據(jù)的加鎖會有一定的系統(tǒng)開銷璃诀,因此不建議用來管理線程弧可,可以作為簡單的開啟新線程的操作。

  • NSOperation:
    NSOperation是基于GCD封裝劣欢,面向?qū)ο蟮淖厮小2恍枰P(guān)心線程管理,數(shù)據(jù)同步的事情凿将,控制并發(fā)數(shù)校套,可以把精力放在自己需要執(zhí)行的操作上。

  • GCD:
    GCD是基于C語言的牧抵,可替代NSThread笛匙, NSOperation的高效和強(qiáng)大的技術(shù),在多線程的管理和運用上使用起來非常的靈活犀变,不僅對線程的管理妹孙,和復(fù)雜線程的需求都能派上用場。

NSTread的使用

線程基本創(chuàng)建

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

// 另一種新建線程蠢正,調(diào)用@selector方法 
[NSThread detachNewThreadSelector:@selector(timeSel) toTarget:self withObject:nil];

// 獲取當(dāng)前線程
NSThread *currentThread = [NSThread currentThread];
// 獲取主線程
NSThread *mainThread = [NSThread mainThread];  

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

// 或者  
NSDate *dateTime = [NSDate dateWithTimeInterval:7 sinceDate:[NSDate date]];  
[NSThread sleepUntilDate:dateTime]; //睡眠,直到時間dateTime線程繼續(xù)進(jìn)行操作

線程間通訊省店,常用方法performSelector

//在當(dāng)前線程嚣崭。延遲執(zhí)行。
[self performSelector:@selector(test) withObject:nil afterDelay:1];
// 回到主線程懦傍。
// waitUntilDone(阻塞當(dāng)前的線程):如果為YES雹舀,就必須等回調(diào)方法執(zhí)行完成之后才能執(zhí)行后面的代碼;
// 如果是NO:就是不等回調(diào)方法結(jié)束谎脯,不會阻塞當(dāng)前線程
[self performSelectorOnMainThread:@selector(test) withObject:nil waitUntilDone:YES];
//開辟子線程
[self performSelectorInBackground:@selector(test) withObject:nil];
//在指定線程執(zhí)行
[self performSelector:@selector(test) onThread:[NSThread currentThread] withObject:nil waitUntilDone:YES]

需要注意的是:如果是帶afterDelay的延時函數(shù)葱跋,會在內(nèi)部創(chuàng)建一個 NSTimer持寄,然后添加到當(dāng)前線程的Runloop中源梭。也就是如果當(dāng)前線程沒有開啟runloop娱俺,該方法會失效。在子線程中废麻,需要啟動runloop(注意調(diào)用順序)

[self performSelector:@selector(test) withObject:nil afterDelay:1];
[[NSRunLoop currentRunLoop] run];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荠卷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子烛愧,更是在濱河造成了極大的恐慌油宜,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怜姿,死亡現(xiàn)場離奇詭異慎冤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)沧卢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蚁堤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人但狭,你說我怎么就攤上這事披诗。” “怎么了立磁?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵呈队,是天一觀的道長。 經(jīng)常有香客問我唱歧,道長宪摧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任颅崩,我火速辦了婚禮绍刮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挨摸。我一直安慰自己孩革,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布得运。 她就那樣靜靜地躺著膝蜈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熔掺。 梳的紋絲不亂的頭發(fā)上饱搏,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機(jī)與錄音置逻,去河邊找鬼推沸。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鬓催。 我是一名探鬼主播肺素,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宇驾!你這毒婦竟也來了倍靡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤课舍,失蹤者是張志新(化名)和其女友劉穎塌西,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筝尾,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡须鼎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年良拼,在試婚紗的時候發(fā)現(xiàn)自己被綠了掰伸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咽瓷。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贸街,靈堂內(nèi)的尸體忽然破棺而出庵寞,到底是詐尸還是另有隱情,我是刑警寧澤薛匪,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布捐川,位于F島的核電站,受9級特大地震影響逸尖,放射性物質(zhì)發(fā)生泄漏古沥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一娇跟、第九天 我趴在偏房一處隱蔽的房頂上張望岩齿。 院中可真熱鬧,春花似錦苞俘、人聲如沸盹沈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乞封。三九已至,卻和暖如春岗憋,著一層夾襖步出監(jiān)牢的瞬間肃晚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工仔戈, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留关串,地道東北人拧廊。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像晋修,于是被迫代替她去往敵國和親吧碾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355