GCD學習筆記

一:GCD併發

全稱:Grand Central Dispatch(純C語言)異步

優點:async

1 GCD是謂多核的並行運算提出的解決方案函數

2 GCD會自動利用更多的CPU內核url

3 GCD會自動管理線程的生命週期(建立線程,調度任務,銷燬線程)spa

4 程序猿只須要告訴GCD想要執行的任務,不須要編寫代碼線程

二:核心概念code

1 任務 :執行生命操做orm

2,隊列:用來存聽任務生命週期

三:GCD使用的兩個步驟

1 定製任務:肯定想作的事

2 將任務添加到隊列:GCD會自動將隊列裏地任務取出,放到對應的線程中執行

四:執行任務

 

1 用同步的方式執行任務(只能在當前線程中執行任務,不具有開新線程的能力)

dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)

 1>兩個參數

queue;隊列

block:任務

2 用異步的方法執行任務(能夠在新的線程中執行任務,具有開線程的能力)

dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)

五:隊列的類型(隊列只決定你的任務如何執行)

1 併發隊列(Concurrent Dispatch Queue)

能夠讓多個任務併發(同時)執行(自動開啓多個線程同時執行任務)

併發功能只能在異步中有效

* GCD默認已經提供了全局的併發隊列,供整個應用環境使用,不須要手動建立

//得到全局的併發隊列

dispatch_queue_t *queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

2 串行隊列(Serial Dispatch Queue)

讓任務一個接着一個的執行

*GCD中獲取串行隊列有兩種途徑

//1,dispatch_queue_create函數建立隊列

dispatch_queue_t *queues = dispatch_queue_create("puguanen.ecit.queue"NULL);

//使用主隊列(跟主線程相關的隊列)(用在線程之間通訊)

*主隊列是GCD自帶的一種特殊的串行隊列

*放在主隊列中的任務,都會放到主線程中執行(此時,將任務放到異步函數中執行時,異步失效)

六:延時執行

1,

// 3秒後自動開啓新線程 執行block中的代碼

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), queue, ^{

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

    });

2,

// 一旦定製好延遲任務後,不會卡主當前線程

    [self performSelector:@selector(download:) withObject:@"http://555.jpg" afterDelay:3];

七,一次性代碼

static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        <#code to be executed once#>

    });

代碼塊中的代碼只執行一次

八:代碼組

兩個(多個)個操做執行完以後再執行下一個操做

    // 1.隊列組

    dispatch_group_t group = dispatch_group_create();

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// 2.下載圖片1

    __block UIImage *image1 = nil;

    dispatch_group_async(group, queue, ^{

        NSURL *url1 = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee460de6182ff5e0fe99257e80.jpg"];

        NSData *data1 = [NSData dataWithContentsOfURL:url1];

        image1 = [UIImage imageWithData:data1];

    });

    

    // 3.下載圖片2

    __block UIImage *image2 = nil;

    dispatch_group_async(group, queue, ^{

        NSURL *url2 = [NSURL URLWithString:@"http://su.bdimg.com/static/superplus/img/logo_white_ee663702.png"];

        NSData *data2 = [NSData dataWithContentsOfURL:url2];

        image2 = [UIImage imageWithData:data2];

    });

    

    // 4.合併圖片 (保證執行完組裏面的全部任務以後,再執行notify函數裏面的block)

    dispatch_group_notify(group, queue, ^{

        // 開啓一個位圖上下文

        UIGraphicsBeginImageContextWithOptions(image1.size, NO, 0.0);

        

        // 繪製第1張圖片

        CGFloat image1W = image1.size.width;

        CGFloat image1H = image1.size.height;

        [image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];

        

        // 繪製第2張圖片

        CGFloat image2W = image2.size.width * 0.5;

        CGFloat image2H = image2.size.height * 0.5;

        CGFloat image2Y = image1H - image2H;

        [image2 drawInRect:CGRectMake(0, image2Y, image2W, image2H)];

        

        // 獲得上下文中的圖片

        UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();

        

        // 結束上下文

        UIGraphicsEndImageContext();

        

        // 5.回到主線程顯示圖片

        dispatch_async(dispatch_get_main_queue(), ^{

            self.imageView.image = fullImage;

        });

    });

相關文章
相關標籤/搜索