oc中多線程

關(guān)于多線程,在編程中那是必不可少的,現(xiàn)在我們就好好梳理一下多線程.

在 iOS 中其實(shí)目前主要有3套多線程方案道逗,他們分別是:

NSThread

GCD

NSOperation & NSOperationQueue


NSThread

NSThread是經(jīng)過蘋果封裝后的权谁,并且完全面向?qū)ο蟮摹K阅憧梢灾苯硬倏鼐€程對象,非常直觀和方便办悟。

它的生命周期還是需要我們手動(dòng)管理,所以并不推薦使用

//多線程處理

-(void)manyThreadHandle

{

//方法1

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(makerun:) object:@"1"];

// 啟動(dòng)

[thread start];

//方法2? 不用手動(dòng)啟動(dòng) 自動(dòng)啟動(dòng)

[NSThread detachNewThreadWithBlock:^{

NSLog(@"--方法2");

}];

//方法3? 不用手動(dòng)啟動(dòng)自動(dòng)啟動(dòng)

[NSThread detachNewThreadSelector:@selector(makerun:) toTarget:self withObject:@"2"];

}

-(void)makerun:(NSThread*)thred

{

NSLog(@"多線程--%@",thred);

}

2017-08-30 16:01:24.863 runtimeTest[6579:165898] --方法2

2017-08-30 16:01:24.864 runtimeTest[6579:165897] 多線程--1

2017-08-30 16:01:24.864 runtimeTest[6579:165899] 多線程--2

在NSThread 中海油很多方法和屬性

//取消線程

- (void)cancel;

//啟動(dòng)線程

- (void)start;

//判斷某個(gè)線程的狀態(tài)的屬性

@property (readonly, getter=isExecuting) BOOL executing;

@property (readonly, getter=isFinished) BOOL finished;

@property (readonly, getter=isCancelled) BOOL cancelled;

//設(shè)置和獲取線程名字

-(void)setName:(NSString *)n;

-(NSString *)name;

//獲取當(dāng)前線程信息

+ (NSThread *)currentThread;

//獲取主線程信息

+ (NSThread *)mainThread;

//使當(dāng)前線程暫停一段時(shí)間捺氢,或者暫停到某個(gè)時(shí)刻

+ (void)sleepForTimeInterval:(NSTimeInterval)time;

+ (void)sleepUntilDate:(NSDate *)date;


GCD 方法

GCD 這個(gè)名字是不是很霸氣 ,天朝人都懂得.其實(shí)指的是Grand Central Dispatch(GCD)

GCD會(huì)自動(dòng)合理地利用更多的CPU內(nèi)核(比如雙核牵敷、四核),最重要的是它會(huì)自動(dòng)管理線程的生命周期(創(chuàng)建線程椿息、調(diào)度任務(wù)歹袁、銷毀線程),完全不需要我們管理寝优,我們只需要告訴干什么就行宇攻。同時(shí)它使用的也是c語言,不過由于使用了 Block(Swift里叫做閉包)倡勇,使得使用起來更加方便,而且靈活。這個(gè)方法比較實(shí)用簡便,強(qiáng)烈推薦.

在GCD中妻熊,加入了兩個(gè)非常重要的概念:任務(wù)隊(duì)列夸浅。

任務(wù)

任務(wù):即操作,你想要干什么扔役,說白了就是一段代碼帆喇,在 GCD 中就是一個(gè) Block,所以添加任務(wù)十分方便亿胸。任務(wù)有兩種執(zhí)行方式:同步執(zhí)行異步執(zhí)行坯钦,主要區(qū)別在于會(huì)不會(huì)阻塞當(dāng)前線程,直到Block中的任務(wù)執(zhí)行完畢侈玄!

同步執(zhí)行:阻塞當(dāng)前線程,不會(huì)開辟新的線程

異步執(zhí)行:不會(huì)阻塞當(dāng)前線,程會(huì)開辟新的線程

隊(duì)列:用于存放任務(wù)婉刀。一共有兩種隊(duì)列,串行隊(duì)列并行隊(duì)列序仙。

放到串行隊(duì)列的任務(wù)突颊,GCD 會(huì)FIFO(先進(jìn)先出)地取出來一個(gè),執(zhí)行一個(gè)潘悼,然后取下一個(gè)律秃,這樣一個(gè)一個(gè)的執(zhí)行。簡單說串行 就是單行車道 ,所有的車(任務(wù))都只能按順序走

放到并行隊(duì)列的任務(wù)治唤,GCD 也會(huì)FIFO的取出來棒动,但不同的是,它取出來一個(gè)就會(huì)放到別的線程宾添,然后再取出來一個(gè)又放到另一個(gè)的線程船惨。這樣由于取的動(dòng)作很快,忽略不計(jì)辞槐,看起來掷漱,所有的任務(wù)都是一起執(zhí)行的。簡單說并行 就是多條車道 ,所有的車(任務(wù))都可以在對應(yīng)車道上走,和隔壁車道沒什么影響

主隊(duì)列? 任何需要刷新 UI 的工作都要在主隊(duì)列執(zhí)行

dispatch_queue_t queue = dispatch_get_main_queue();

自己創(chuàng)建隊(duì)列

//串行隊(duì)列

dispatch_queue_t queue = dispatch_queue_create("tk22.bournes.testQueue", NULL);

dispatch_queue_t queue = dispatch_queue_create("tk22.bournes.testQueue", DISPATCH_QUEUE_SERIAL);

//并行隊(duì)列

dispatch_queue_t queue = dispatch_queue_create("tk22.bournes.testQueue", DISPATCH_QUEUE_CONCURRENT);

//全局并行隊(duì)列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

隊(duì)列組

隊(duì)列組可以將很多隊(duì)列添加到一個(gè)組里榄檬,這樣做的好處是卜范,當(dāng)這個(gè)組里所有的任務(wù)都執(zhí)行完了,隊(duì)列組會(huì)通過一個(gè)方法通知我們鹿榜。

//1.創(chuàng)建隊(duì)列組

dispatch_group_t group = dispatch_group_create();

//2.創(chuàng)建隊(duì)列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//多次使用隊(duì)列組的方法執(zhí)行任務(wù), 只有異步方法

//執(zhí)行3次循環(huán)

dispatch_group_async(group, queue, ^{

for (NSInteger i = 0; i < 3; i++) {

NSLog(@"group-01 - %@", [NSThread currentThread]);

}

});

//主隊(duì)列執(zhí)行8次循環(huán)

dispatch_group_async(group, dispatch_get_main_queue(), ^{

for (NSInteger i = 0; i < 8; i++) {

NSLog(@"group-02 - %@", [NSThread currentThread]);

}

});

//執(zhí)行10次循環(huán)

dispatch_group_async(group, queue, ^{

for (NSInteger i = 0; i < 10; i++) {

NSLog(@"group-03 - %@", [NSThread currentThread]);

}

});

//4.都完成后會(huì)自動(dòng)通知

dispatch_group_notify(group, dispatch_get_main_queue(), ^{

NSLog(@"完成 - %@", [NSThread currentThread]);

});

//運(yùn)行結(jié)果

2017-08-30 16:21:36.201 runtimeTest[6843:174540] group-01 -{number = 3, name = (null)} ? ? ? ? ?2017-08-30 16:21:36.201 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ? 2017-08-30 16:21:36.202 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.202 runtimeTest[6843:174540] group-01 -{number = 3, name = (null)} ? ? ? ? 2017-08-30 16:21:36.202 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.202 runtimeTest[6843:174540] group-01 -{number = 3, name = (null)} ? ? ? ? 2017-08-30 16:21:36.202 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.202 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.202 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.203 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.203 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.203 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.203 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.206 runtimeTest[6843:174502] group-02 -{number = 1, name = main} ? ? ? ? 2017-08-30 16:21:36.207 runtimeTest[6843:174502] group-02 -{number = 1, name = main} ? ? ? ? ?2017-08-30 16:21:36.207 runtimeTest[6843:174502] group-02 -{number = 1, name = main} ? ? ? ? ?2017-08-30 16:21:36.207 runtimeTest[6843:174502] group-02 -{number = 1, name = main} ? ? ? ? ?2017-08-30 16:21:36.207 runtimeTest[6843:174502] group-02 -{number = 1, name = main} ? ? ? ? ?2017-08-30 16:21:36.208 runtimeTest[6843:174502] group-02 -{number = 1, name = main} ? ? ? ? 2017-08-30 16:21:36.208 runtimeTest[6843:174502] group-02 -{number = 1, name = main} ? ? ? ? 2017-08-30 16:21:36.208 runtimeTest[6843:174502] group-02 -{number = 1, name = main} ? ? ? ? ?2017-08-30 16:21:36.209 runtimeTest[6843:174502] 完成 -{number = 1, name = main}


NSOperation和NSOperationQueue

NSOperation 是蘋果公司對 GCD 的封裝海雪,完全面向?qū)ο螅允褂闷饋砀美斫?有很多和GCD比較類似

NSOperation 和 NSOperationQueue分別對應(yīng) GCD 的任務(wù) 和 隊(duì)列

NSOperation只是一個(gè)抽象類舱殿,所以不能封裝任務(wù)它有 2 個(gè)子類用于封裝任務(wù)奥裸。分別是:NSInvocationOperation和NSBlockOperation

當(dāng)你新創(chuàng)建一個(gè) Operation 后,需要手動(dòng)的調(diào)用start方法來啟動(dòng)任務(wù)沪袭,它會(huì)默認(rèn)在當(dāng)前隊(duì)列同步執(zhí)行湾宙。當(dāng)然你也可以在中途取消一個(gè)任務(wù),只需要調(diào)用其cancel方法即可。


//1.創(chuàng)建NSInvocationOperation對象

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];

//2.開始執(zhí)行

[operation start];

//1.創(chuàng)建NSBlockOperation對象

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"%@", [NSThread currentThread]);

}];

//添加多個(gè)Block

for (NSInteger i = 0; i < 5; i++) {

[operation addExecutionBlock:^{

NSLog(@"第%ld次:%@", i, [NSThread currentThread]);

}];

}

//2.開始任務(wù)

[operation start];

2017-08-30 16:33:12.868 runtimeTest[7014:179819]{number = 1, name = main}

2017-08-30 16:33:12.869 runtimeTest[7014:179819] 第3次:{number = 1, name = main}

2017-08-30 16:33:12.869 runtimeTest[7014:179819] 第4次:{number = 1, name = main}

2017-08-30 16:33:12.868 runtimeTest[7014:179888] 第1次:{number = 4, name = (null)}

2017-08-30 16:33:12.868 runtimeTest[7014:179892] 第0次:{number = 3, name = (null)}

2017-08-30 16:33:12.869 runtimeTest[7014:179889] 第2次:{number = 5, name = (null)}

根據(jù)結(jié)果可以知道打印的順序是亂的 這個(gè)也符合我們異步的任務(wù)執(zhí)行情況

//1.創(chuàng)建NSBlockOperation對象

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"%@", [NSThread currentThread]);

}];

//2.開始任務(wù)

[operation start];

創(chuàng)建隊(duì)列

//主隊(duì)列

NSOperationQueue *queue = [NSOperationQueue mainQueue];

//1.創(chuàng)建一個(gè)其他隊(duì)列

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

//2.創(chuàng)建NSBlockOperation對象

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"%@", [NSThread currentThread]);

}];

//3.添加多個(gè)Block

for (NSInteger i = 0; i < 2; i++) {

[operation addExecutionBlock:^{

NSLog(@"第%ld次:%@", i, [NSThread currentThread]);

}];

}

//4.隊(duì)列添加任務(wù)

[queue addOperation:operation];

2017-08-30 16:35:56.163 runtimeTest[7073:181494]{number = 3, name = (null)}

2017-08-30 16:35:56.163 runtimeTest[7073:181537] 第0次:{number = 4, name = (null)}

2017-08-30 16:35:56.163 runtimeTest[7073:181538] 第1次:{number = 5, name = (null)}

NSOperation有一個(gè)非常實(shí)用的功能侠鳄,那就是添加依賴 和gcd中的隊(duì)列組管理有點(diǎn)類似.有點(diǎn)啰嗦了,就先介紹這些吧,以后有時(shí)間會(huì)更新.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末埠啃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伟恶,更是在濱河造成了極大的恐慌碴开,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件博秫,死亡現(xiàn)場離奇詭異潦牛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)挡育,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門巴碗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人静盅,你說我怎么就攤上這事良价。” “怎么了蒿叠?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵明垢,是天一觀的道長。 經(jīng)常有香客問我市咽,道長痊银,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任施绎,我火速辦了婚禮溯革,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谷醉。我一直安慰自己致稀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布俱尼。 她就那樣靜靜地躺著抖单,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遇八。 梳的紋絲不亂的頭發(fā)上矛绘,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機(jī)與錄音刃永,去河邊找鬼货矮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛斯够,可吹牛的內(nèi)容都是我干的囚玫。 我是一名探鬼主播喧锦,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼劫灶!你這毒婦竟也來了裸违?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤本昏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后枪汪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涌穆,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年雀久,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宿稀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赖捌,死狀恐怖祝沸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情越庇,我是刑警寧澤罩锐,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站卤唉,受9級特大地震影響涩惑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桑驱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一竭恬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧熬的,春花似錦痊硕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至强戴,卻和暖如春亭螟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骑歹。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工预烙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人道媚。 一個(gè)月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓扁掸,卻偏偏與公主長得像翘县,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子谴分,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一锈麸、前言 上一篇文章iOS多線程淺匯-原理篇中整理了一些有關(guān)多線程的基本概念。本篇博文介紹的是iOS中常用的幾個(gè)多...
    nuclear閱讀 2,050評論 6 18
  • 在這篇文章中牺蹄,我將為你整理一下 iOS 開發(fā)中幾種多線程方案忘伞,以及其使用方法和注意事項(xiàng)。當(dāng)然也會(huì)給出幾種多線程的案...
    張戰(zhàn)威ican閱讀 603評論 0 0
  • 文章目錄GCD簡介任務(wù)和隊(duì)列GCD的使用步驟隊(duì)列的創(chuàng)建方法任務(wù)的創(chuàng)建方法GCD的基本使用并行隊(duì)列 + 同步執(zhí)行并行...
    lusen_b閱讀 247評論 0 1
  • 一沙兰、前言 本篇博文介紹的是iOS中常用的幾個(gè)多線程技術(shù): NSThread GCD NSOperation 由于a...
    和玨貓閱讀 577評論 0 1
  • 正常健康的嘴唇一般膚色紅潤而有光澤氓奈,干濕適度而有彈性。 2.嘴唇為紅色或深紅色鼎天、紫紅色 這是提示你的身體狀態(tài)火比較...
    微微小醫(yī)閱讀 319評論 0 0