多線程

多線程

先在storyboard上繪制兩顆按鈕,并且綁定事件稀余。

button.png

先看下面一段代碼:

- (IBAction)blueButtonClicked:(UIButton *)sender {
    NSLog(@"藍(lán)色按鈕任務(wù)開(kāi)始執(zhí)行");
    // 模擬任務(wù)需要執(zhí)行5s
    sleep(5);
    NSLog(@"藍(lán)色按鈕任務(wù)已經(jīng)完成");
}

- (IBAction)yellowButtonClicked:(UIButton *)sender {
    NSLog(@"黃色按鈕任務(wù)完成");
}

點(diǎn)擊藍(lán)色按鈕之后就會(huì)卡在那里了国葬,如果此時(shí)點(diǎn)擊黃色按鈕,不能看到NSLog打印的語(yǔ)句未辆,但事實(shí)上任務(wù)已經(jīng)執(zhí)行了窟绷,必須等到藍(lán)色按鈕執(zhí)行的事件執(zhí)行完之后控制臺(tái)才能打印出來(lái)。

多線程


- (void) bar:(UIButton *)sender{
    sender.enabled = YES;
    [sender setTitle:@"藍(lán)色" forState:UIControlStateNormal];
}

- (IBAction)yellowButtonClicked:(UIButton *)sender {
    NSLog(@"黃色按鈕任務(wù)完成");
}
  • 第一種方式
- (IBAction)blueButtonClicked:(UIButton *)sender {
    [sender setTitle:@"正在執(zhí)行..." forState:UIControlStateNormal];
    sender.enabled = NO;
    
    // 提示:對(duì)于那些耗時(shí)間的任務(wù)基本上都應(yīng)該放到其它的執(zhí)行線程中
    // 不要阻塞主線程的執(zhí)行 否則界面會(huì)出現(xiàn)卡頓或假死現(xiàn)象
    // 模擬任務(wù)需要執(zhí)行5s
    //sleep(5);
    //NSLog(@"藍(lán)色按鈕任務(wù)已經(jīng)完成");
    
    [self performSelectorInBackground:@selector(foo:) withObject:sender];
}

- (void) foo:(UIButton *)sender{
    sleep(5);
    NSLog(@"藍(lán)色按鈕任務(wù)已經(jīng)完成");
    // 執(zhí)行完之后要恢復(fù)按鈕的狀態(tài)
    //sender.enabled = YES;
    //[sender setTitle:@"藍(lán)色" forState:0];
    // 提示:刷新視圖界面要回到主線程執(zhí)行,如果直接在這里執(zhí)行 可能會(huì)失效
    [self performSelectorOnMainThread:@selector(bar:) withObject:sender waitUntilDone:YES];
}
  • 第二種方式1
- (IBAction)blueButtonClicked:(UIButton *)sender {
    [sender setTitle:@"正在執(zhí)行..." forState:UIControlStateNormal];
    sender.enabled = NO;
    [NSThread detachNewThreadSelector:@selector(foo:) toTarget:self withObject:sender];
}

- (void) foo:(UIButton *)sender{
    sleep(5);
    NSLog(@"藍(lán)色按鈕任務(wù)已經(jīng)完成");
    [self performSelectorOnMainThread:@selector(bar:) withObject:sender waitUntilDone:YES];
}
  • 第二種方式2
- (IBAction)blueButtonClicked:(UIButton *)sender {
    [sender setTitle:@"正在執(zhí)行..." forState:UIControlStateNormal];
    sender.enabled = NO;
    
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(foo:) object:sender];
    
    [thread start];
    //[thread cancel];// 如果加上這句任務(wù)取消
    
    // 如果線程已經(jīng)開(kāi)始執(zhí)行則無(wú)法取消
    
    // 下面的方法任務(wù)不能取消
    //[thread start];
    //sleep(1);
    //[thread cancel];
}

- (void) foo:(UIButton *)sender{
    // 休眠和退出都是只有正在執(zhí)行的線程可以調(diào)用的方法
    // 因此在設(shè)計(jì)上這兩個(gè)方法都是類(lèi)方法而不是對(duì)象方法
    //[NSThread exit];
    
    sleep(5);
    NSLog(@"藍(lán)色按鈕任務(wù)已經(jīng)完成");
    
    [self performSelectorOnMainThread:@selector(bar:) withObject:sender waitUntilDone:YES];
}
  • 第三種方式
- (IBAction)blueButtonClicked:(UIButton *)sender {
    [sender setTitle:@"正在執(zhí)行..." forState:UIControlStateNormal];
    sender.enabled = NO;
    
    // 創(chuàng)建一個(gè)操作對(duì)象(將該操作放到一個(gè)隊(duì)列中去執(zhí)行)
    NSOperation *op = [NSBlockOperation blockOperationWithBlock:^{
        [self foo:sender];
    }];
    // 創(chuàng)建一個(gè)并發(fā)隊(duì)列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    // 設(shè)置最大并發(fā)數(shù)
    queue.maxConcurrentOperationCount = 5;
    // 向隊(duì)列中添加一個(gè)操作
    [queue addOperation:op]; 
}

- (void) foo:(UIButton *)sender{
    sleep(5);
    NSLog(@"藍(lán)色按鈕任務(wù)已經(jīng)完成");
    
    // 創(chuàng)建一個(gè)操作對(duì)象
    NSOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(bar:) object:sender];
    // 向主線程操作隊(duì)列中添加操作對(duì)象(操作放到主線程中執(zhí)行)
    [[NSOperationQueue mainQueue] addOperation:op];
    
}
  • 第四種方法
- (IBAction)blueButtonClicked:(UIButton *)sender {
    [sender setTitle:@"正在執(zhí)行..." forState:UIControlStateNormal];
    sender.enabled = NO;

    // GCD - Grand Center Dispatch
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        sleep(5);
        NSLog(@"藍(lán)色按鈕任務(wù)已經(jīng)完成");
        dispatch_async(dispatch_get_main_queue(), ^{
            sender.enabled = YES;
            [sender setTitle:@"藍(lán)色" forState:UIControlStateNormal];
        });
    });
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咐柜,一起剝皮案震驚了整個(gè)濱河市兼蜈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拙友,老刑警劉巖为狸,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異遗契,居然都是意外死亡辐棒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)漾根,“玉大人泰涂,你說(shuō)我怎么就攤上這事》拢” “怎么了逼蒙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)寄疏。 經(jīng)常有香客問(wèn)我其做,道長(zhǎng),這世上最難降的妖魔是什么赁还? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任妖泄,我火速辦了婚禮,結(jié)果婚禮上艘策,老公的妹妹穿的比我還像新娘蹈胡。我一直安慰自己,他們只是感情好朋蔫,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布罚渐。 她就那樣靜靜地躺著,像睡著了一般驯妄。 火紅的嫁衣襯著肌膚如雪荷并。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天青扔,我揣著相機(jī)與錄音源织,去河邊找鬼。 笑死微猖,一個(gè)胖子當(dāng)著我的面吹牛谈息,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凛剥,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼侠仇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了犁珠?” 一聲冷哼從身側(cè)響起逻炊,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎犁享,沒(méi)想到半個(gè)月后余素,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饼疙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年溺森,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了慕爬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窑眯。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屏积,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出磅甩,到底是詐尸還是另有隱情炊林,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布卷要,位于F島的核電站渣聚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏僧叉。R本人自食惡果不足惜奕枝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓶堕。 院中可真熱鬧隘道,春花似錦、人聲如沸郎笆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宛蚓。三九已至激捏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凄吏,已是汗流浹背远舅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痕钢,地道東北人表谊。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像盖喷,于是被迫代替她去往敵國(guó)和親爆办。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • 從哪說(shuō)起呢课梳? 單純講多線程編程真的不知道從哪下嘴距辆。。 不如我直接引用一個(gè)最簡(jiǎn)單的問(wèn)題暮刃,以這個(gè)作為切入點(diǎn)好了 在ma...
    Mr_Baymax閱讀 2,734評(píng)論 1 17
  • 本文首發(fā)于我的個(gè)人博客:「程序員充電站」[https://itcharge.cn]文章鏈接:「?jìng)魉烷T(mén)」[https...
    ITCharge閱讀 59,812評(píng)論 50 538
  • 表面看來(lái)跨算,朋友圈里是八國(guó)代購(gòu),面膜稱(chēng)霸椭懊。實(shí)際呢诸蚕,也是暗藏私情,藤蔓交錯(cuò)。 N小姐坐電腦前背犯,寫(xiě)了一會(huì)兒字坏瘩,揉揉眼睛,...
    瞬間收集閱讀 2,273評(píng)論 8 28
  • 小馬哥myr 在這春暖花開(kāi)的季節(jié)漠魏,卻被菜弄蒙了圈倔矾。前段時(shí)間去菜市買(mǎi)菜,看見(jiàn)大媽們買(mǎi)菜論個(gè)買(mǎi)柱锹,我心里就納悶了哪自?怎么要...
    6_myr閱讀 156評(píng)論 0 0
  • 照亮了黑暗, 升起了朝陽(yáng)禁熏。 唐朝的神聖再度登場(chǎng)壤巷。 與妃共舞,神采飛揚(yáng)瞧毙。 大唐神兵胧华,威震八方。 你看那唐王升筏,氣宇軒昂...
    迷你小詩(shī)人閱讀 267評(píng)論 0 2