iOS開發(fā)中的四種GCD

//
//  ViewController.m
//  GCDDemo1
//
//  Created by WangZhi on 16/6/3.
//  Copyright ? 2016年 WangZhi. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    NSLog(@"%@", [NSThread currentThread]);
    
    // GCD核心:將 操作/任務(wù) 放到 隊(duì)列 中
    
    //    [self GCD1];
    //    [self GCD2];
    //    [self GCD3];
    [self GCD4];
}
?

#pragma mark - 串行隊(duì)列

- (void)GCD1 {
    // 特點(diǎn): 可以保證效率(會(huì)新建一個(gè)子線程),能夠?qū)崿F(xiàn)并發(fā)! (因?yàn)樾陆ㄗ泳€程是有開銷的,所以不能無(wú)休止的新建線程.)
    // 使用串行隊(duì)列的異步任務(wù)非常非常非常有用!!!
    // 應(yīng)用場(chǎng)景: 從網(wǎng)絡(luò)上下載圖片,然后加濾鏡處理
    // 在C語(yǔ)言函數(shù)中,定義類型絕大多數(shù)都是以_t或ref結(jié)尾的.
    
    dispatch_queue_t q = dispatch_queue_create("Queue1", DISPATCH_QUEUE_SERIAL); // 串行隊(duì)列

    // 非ARC開發(fā)環(huán)境中,千萬(wàn)別忘記release
    // dispatch_release(q);

    // 1. 串行隊(duì)列的同步任務(wù)
    for (int i = 0; i < 10; i++) {
        dispatch_sync(q, ^{ // 同步任務(wù),順序執(zhí)行,會(huì)在主線程上運(yùn)行(在開發(fā)中極少用)
            NSLog(@"%@ - %d", [NSThread currentThread], i);
        });
    }
    
    // 2. 串行隊(duì)列的異步任務(wù)
    for (int i = 0; i < 10; i++) {
        dispatch_async(q, ^{ // 異步任務(wù),順序執(zhí)行,會(huì)在子線程上運(yùn)行(會(huì)新建一個(gè)子線程) (異步任務(wù),并發(fā)執(zhí)行,但如果在串行隊(duì)列中,仍然會(huì)依次順序執(zhí)行)
            // [NSThread currentThread]:可以在開發(fā)中,跟蹤當(dāng)前線程
            // number = 1,表示主線程; number = 2,表示第二個(gè)子線程,以此類推.
            NSLog(@"%@ - %d", [NSThread currentThread], i);
        });
    }
}


#pragma mark - 并行隊(duì)列

- (void)GCD2 {
    // 特點(diǎn): 沒(méi)有隊(duì)形,執(zhí)行順序程序員不能控制!!!
    // 缺點(diǎn): 并行隊(duì)列易出錯(cuò),并且不能控制新建子線程的數(shù)量.
    // 應(yīng)用場(chǎng)景: 并發(fā)執(zhí)行任務(wù),沒(méi)有先后順序
    dispatch_queue_t q = dispatch_queue_create("Queue2", DISPATCH_QUEUE_CONCURRENT); // 并行隊(duì)列

    // 1. 并行隊(duì)列的同步任務(wù)
    for (int i = 0; i < 10; i++) {
        dispatch_sync(q, ^{ // 同步任務(wù),順序執(zhí)行,會(huì)在主線程上運(yùn)行
            NSLog(@"%@ - %d", [NSThread currentThread], i);
        });
    }

    // 2. 并行隊(duì)列的異步任務(wù)
    for (int i = 0; i < 10; i++) {
        dispatch_async(q, ^{ // 異步任務(wù),并發(fā)執(zhí)行,會(huì)在子線程上運(yùn)行(可能會(huì)新建多個(gè)子線程)
            NSLog(@"%@ - %d", [NSThread currentThread], i);
        });
    }
}


#pragma mark - 全局隊(duì)列:蘋果為了方便多線程的設(shè)計(jì),提供了一個(gè)全局隊(duì)列,供所有的APP共同使用

- (void)GCD3 { 
     // 全局隊(duì)列與并行隊(duì)列的區(qū)別:
     // - 不需要?jiǎng)?chuàng)建,直接get就可以獲得;
     // - 全局隊(duì)列沒(méi)有名稱,調(diào)試時(shí),無(wú)法確認(rèn)準(zhǔn)確隊(duì)列;
     // - 與并行隊(duì)列執(zhí)行效果相同,屬于并行隊(duì)列類型.

    dispatch_queue_t global_q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 第二個(gè)參數(shù)flags傳0,原因:Reserved for future use. Passing any value other than zero may result in a NULL return value. (保留供將來(lái)使用.傳遞除零以外的任何值可能會(huì)導(dǎo)致NULL返回值.)

    // 1. 全局隊(duì)列的同步任務(wù)
    for (int i = 0; i < 10; i++) {
        dispatch_sync(global_q, ^{ // 同步任務(wù),順序執(zhí)行,會(huì)在主線程上運(yùn)行
            NSLog(@"%@ - %d", [NSThread currentThread], i);
        });
    }

    // 2. 全局隊(duì)列的異步任務(wù)
    for (int i = 0; i < 10; i++) {
        dispatch_async(global_q, ^{ // 異步任務(wù),并發(fā)執(zhí)行,會(huì)在子線程上運(yùn)行(可能會(huì)新建多個(gè)子線程)
            NSLog(@"%@ - %d", [NSThread currentThread], i);
        });
    }
}


#pragma mark - 主隊(duì)列(主線程): 保證操作在主線程上執(zhí)行

- (void)GCD4 { 
     // 每一個(gè)應(yīng)用程序都只有一個(gè)主線程.
     // - 為什么需要在主線程上工作呢?原因:在iOS開發(fā)中,所有UI的更新工作都必須在主線程上執(zhí)行.
     // - 主隊(duì)列屬于串行隊(duì)列類型.
    
    dispatch_queue_t main_q = dispatch_get_main_queue();

    // 線程阻塞了!  原因:主線程是有工作的,而且除非將程序kill掉,否則主線程的工作永遠(yuǎn)不會(huì)結(jié)束,所以不會(huì)執(zhí)行到 NSLog(@"main_q %@", [NSThread currentThread]); 這一行代碼.
    
    // 1. 主隊(duì)列的同步任務(wù)
//    dispatch_sync(main_q, ^{ // 同步任務(wù),順序執(zhí)行
//        NSLog(@"main_q %@", [NSThread currentThread]); // 進(jìn)入斷點(diǎn)
//    });

    // 2. 主隊(duì)列的異步任務(wù)
    for (int i = 0; i < 10; i++) {
        dispatch_async(main_q, ^{ // 異步任務(wù),在主線程中會(huì)依次順序執(zhí)行
            NSLog(@"%@ - %d", [NSThread currentThread], i);
        });
    }
 
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
    
@end
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容