2019-08-07 iOS多線程開發(fā)

iOS開發(fā)常常會(huì)碰到多線程開發(fā)技術(shù),我們常用的集中多線程開發(fā)的技術(shù)有一下幾點(diǎn):
(1)pThread進(jìn)行開發(fā),pthread是基于C語(yǔ)言稽亏;
(2)NSThread 進(jìn)行開辟多線程方式;
(3)GCD ;
(4)NSOperation.

接下來(lái)對(duì)上面幾種多線程技術(shù)進(jìn)行詳細(xì)的講解:
一.pThread
(1) pThread的創(chuàng)建線程方式
pthread_t thread;
pthread_create(&thread, NULL, run, NULL);
//run是需要在子線程實(shí)現(xiàn)的方法。
void *run(void *data){
NSLog(@"我在子線程中執(zhí)行……");
for (int i = 1; i < 10 ; i ++) {
NSLog(@"%d",i);
sleep(1);
}
return NULL;
}
2.NSThread 創(chuàng)建線程有三種方式
(1)方式一 NSThread *thread1 = [[NSThread alloc] initWithTarget:self
selector:@selector(runNSThread1) object:nil];
thread1.name = @"Name_thread1"; //設(shè)置線程的識(shí)別名
[thread1 setThreadPriority:0.7]; //設(shè)置優(yōu)先級(jí)別
[thread1 start];
//runNSThread1 是在子線程里呕臂,執(zhí)行的方法。
在子線程里肪跋,怎么回到主線程的方法需要調(diào)用 [self performSelectorOnMainThread:@selector(runMainThread) withObject:nil waitUntilDone:YES];回到主線程執(zhí)行的方法runMainThread這個(gè)方法內(nèi)部就是在主線程執(zhí)行了歧蒋。
(2)方式二 通過(guò)detachNewThreadSelector方式創(chuàng)建并執(zhí)行線程
[NSThread detachNewThreadSelector:@selector(runNSThread1) toTarget:self withObject:nil];
(3)方式三 通過(guò)performSelectorInBackground方式創(chuàng)建并執(zhí)行線程
[self performSelectorInBackground:@selector(runNSThread1) withObject:nil];

獲取當(dāng)前線程的信息 [NSThread currentThread].name ;
3.GCD
(1)dispatch_async創(chuàng)建一個(gè)線程
// dispatch_async(dispatch_get_global_queue(0, 0), ^{
// //執(zhí)行耗時(shí)任務(wù)
// NSLog(@"start task 1");
// [NSThread sleepForTimeInterval:2];
// NSLog(@"end task 1");
// dispatch_async(dispatch_get_main_queue(), ^{
// //刷新UI
// NSLog(@"回到主線程,刷新UI");
// });
// });
(2)多線程的線程的優(yōu)先級(jí)別
//dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
// //執(zhí)行耗時(shí)任務(wù)
// NSLog(@"start task 1");
// [NSThread sleepForTimeInterval:2];
// NSLog(@"end task 1");
// });
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
// NSLog(@"start task 2");
// [NSThread sleepForTimeInterval:2];
// NSLog(@"end task 2");
// });
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// //執(zhí)行耗時(shí)任務(wù)
// NSLog(@"start task 3");
// [NSThread sleepForTimeInterval:2];
// NSLog(@"end task 3");
// });

DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_DEFAULT
是優(yōu)先級(jí)別的參數(shù)州既。
(3)dispatch_queue_t 創(chuàng)建異步執(zhí)行和串行執(zhí)行queue
dispatch_queue_t queue = dispatch_queue_create("com.text.cn", DISPATCH_QUEUE_CONCURRENT);
// //NULL 為串行的 其實(shí)在同一個(gè)線程里執(zhí)行的= DISPATCH_QUEUE_SERIAL
// //DISPATCH_QUEUE_CONCURRENT - 為異步執(zhí)行
// dispatch_async(queue, ^{
// //執(zhí)行耗時(shí)任務(wù)
// NSLog(@"start task 1");
// [NSThread sleepForTimeInterval:2];
// NSLog(@"end task 1");
// });
// dispatch_async(queue, ^{
// //執(zhí)行耗時(shí)任務(wù)
// NSLog(@"start task 2");
// [NSThread sleepForTimeInterval:2];
// NSLog(@"end task 2");
// });
// dispatch_async(queue, ^{
// //執(zhí)行耗時(shí)任務(wù)
// NSLog(@"start task 3");
// [NSThread sleepForTimeInterval:2];
// NSLog(@"end task 3");
// });
//NULL 為串行的 其實(shí)在同一個(gè)線程里執(zhí)行的= DISPATCH_QUEUE_SERIAL
// //DISPATCH_QUEUE_CONCURRENT - 為異步執(zhí)行
(4)dispatch_group_t 執(zhí)行一定的任務(wù)谜洽,可以用dispatch_group_notify接收所有的任務(wù)執(zhí)行完的一個(gè)后續(xù)操作,當(dāng)前現(xiàn)在在最后一個(gè)執(zhí)行完的線程里操作吴叶,需要回到主線程來(lái)操作
dispatch_queue_t queue1 = dispatch_queue_create("com.cn.ctvit.reque", DISPATCH_QUEUE_CONCURRENT); //異步
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue1, ^{
//內(nèi)部可以執(zhí)行異步操作阐虚,當(dāng)前不是異步操作,如果是異步操作試一試
NSLog(@"start task 1");
[NSThread sleepForTimeInterval:2];
NSLog(@"end task 1");
});

dispatch_group_async(group, queue1, ^{
    NSLog(@"start task 2");
    [NSThread sleepForTimeInterval:2];
    NSLog(@"end task 2");
});

dispatch_group_async(group, queue1, ^{
    NSLog(@"start task 3");
    [NSThread sleepForTimeInterval:2];
    NSLog(@"end task 3");
});

dispatch_group_notify(group, queue1, ^{
    NSLog(@"all task done");
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"回到主線程");
    });
});

(5)GCD實(shí)現(xiàn)單例
(6)GCD實(shí)現(xiàn)延遲操作
//延遲執(zhí)行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t) (2*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"dely excute");
});

4.NSInvocationOperation蚌卤,NSBlockOperation实束,NSOperation和NSOperationqueue 的組合運(yùn)用
(1)NSInvocationOperation
//同步執(zhí)行-放主線程里則會(huì)阻塞主線程,放在子線程則會(huì)阻塞子線程
// NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(goInvocation) object:nil];
// [invocation start];

//創(chuàng)建一個(gè)子線程-則阻塞子線程
// dispatch_async(dispatch_get_global_queue(0, 0), ^{
// NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(goInvocation) object:nil];
// [invocation start];
// });

(2)NSBlockOperation
//同步執(zhí)行
// NSBlockOperation *blockOpration = [NSBlockOperation blockOperationWithBlock:^{
// for (int i = 0; i < 3; i ++) {
// NSLog(@"start task");
// [NSThread sleepForTimeInterval:2];
// }
// }];
// [blockOpration start];
(3)NSOperation 和 NSOperationQueue
if (!self.oprQueue) {
self.oprQueue = [[NSOperationQueue alloc] init];
}
[self.oprQueue setMaxConcurrentOperationCount:4];

CustomOperation *operationA = [[CustomOperation alloc] initWithName:@"operationA"];
CustomOperation *operationB = [[CustomOperation alloc] initWithName:@"operationB"];
CustomOperation *operationC = [[CustomOperation alloc] initWithName:@"operationC"];
CustomOperation *operationD = [[CustomOperation alloc] initWithName:@"operationD"];

[operationD addDependency:operationA];
[operationA addDependency:operationB];
[operationB addDependency:operationC];  //依賴關(guān)系不能相互依賴逊彭,也就是循環(huán)依賴

//異步執(zhí)行
[self.oprQueue addOperation:operationA];
[self.oprQueue addOperation:operationB];
[self.oprQueue addOperation:operationC];
[self.oprQueue addOperation:operationD];

//CustomOperation是繼承NSOperation 重寫了main函數(shù)執(zhí)行的咸灿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市侮叮,隨后出現(xiàn)的幾起案子避矢,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件审胸,死亡現(xiàn)場(chǎng)離奇詭異分尸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)歹嘹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門箩绍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人尺上,你說(shuō)我怎么就攤上這事材蛛。” “怎么了怎抛?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵卑吭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我马绝,道長(zhǎng)豆赏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任富稻,我火速辦了婚禮掷邦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘椭赋。我一直安慰自己抚岗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布哪怔。 她就那樣靜靜地躺著宣蔚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪认境。 梳的紋絲不亂的頭發(fā)上胚委,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音叉信,去河邊找鬼亩冬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛茉盏,可吹牛的內(nèi)容都是我干的鉴未。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼鸠姨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了淹真?” 一聲冷哼從身側(cè)響起讶迁,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎核蘸,沒(méi)想到半個(gè)月后巍糯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啸驯,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年祟峦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了罚斗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宅楞,死狀恐怖针姿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厌衙,我是刑警寧澤距淫,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站婶希,受9級(jí)特大地震影響榕暇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喻杈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一彤枢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筒饰,春花似錦堂污、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至换棚,卻和暖如春式镐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背固蚤。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工娘汞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夕玩。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓你弦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親燎孟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子禽作,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • 目錄: (一)線程與進(jìn)程之間的區(qū)別 (二)為什么需要學(xué)習(xí)多線程 (三)多線程任務(wù)執(zhí)行方式 (四)多線程執(zhí)行的...
    KingLionsFrank閱讀 786評(píng)論 6 6
  • 一、多線程基礎(chǔ) 基本概念 進(jìn)程進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序每個(gè)進(jìn)程之間是獨(dú)立的揩页,每個(gè)進(jìn)程均運(yùn)行在其專用且...
    AlanGe閱讀 549評(píng)論 0 0
  • 上文我們簡(jiǎn)單的敘述了多線程,那么這篇我們就詳細(xì)的說(shuō)一下! 多線程技術(shù)方案 PThread 導(dǎo)入頭文件 #impor...
    Clark_new閱讀 397評(píng)論 5 2
  • 在這篇文章中旷偿,我將為你整理一下 iOS 開發(fā)中幾種多線程方案,以及其使用方法和注意事項(xiàng)。當(dāng)然也會(huì)給出幾種多線程的案...
    張戰(zhàn)威ican閱讀 603評(píng)論 0 0
  • 文/行香子閆 我妹妹特別愛(ài)吃肉萍程,從小到大幢妄,每次吃飯,她總是吃著自己碗里的茫负,眼睛看著我的碗里的!“姐姐蕉鸳,你的吃的完嗎...
    行香子閆閱讀 337評(píng)論 2 3