建立線程方式-GCD

 

GCD

(1)GCD基本知識web

GCD:Grand central Dispatch  牛逼的中樞調度器
01 兩個核心概念:隊列和任務
  使用步驟:1.定製任務,2.將任務添加到隊列中(遵循先進先出的原則) 02 同步函數和異步函數
  

(2)GCD基本使用併發

 01 異步函數+併發隊列:開啓多條線程,併發執行任務 app

02 異步函數+串行隊列:開啓一條線程,串行執行任務 異步

03 同步函數+併發隊列:不開線程,串行執行任務 async

04 同步函數+串行隊列:不開線程,串行執行任務 ide

05 異步函數+主隊列:不開線程,在主線程中串行執行任務 函數

06 同步函數+主隊列:不開線程,串行執行任務(注意死鎖發生)url

主隊列特色:若是發現主線程當前正在執行代碼(任務),那麼主隊列將不會調度隊列裏的任務,直到主線程的任務執行完畢 spa

07 注意同步函數和異步函數在執行順序上面的差別 線程

(3)GCD線程間通訊

//0.獲取一個全局的併發隊列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    //1.先開啓一個線程,把下載圖片的操做放在子線程中處理
    dispatch_async(queue, ^{

       //2.下載圖片
        NSURL *url = [NSURL URLWithString:@"http://h.hiphotos.baidu.com/zhidao/pic/item/6a63f6246b600c3320b14bb3184c510fd8f9a185.jpg"];
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage *image = [UIImage imageWithData:data];

        NSLog(@"下載操做所在的線程--%@",[NSThread currentThread]);

        //3.回到主線程刷新UI
        dispatch_async(dispatch_get_main_queue(), ^{
           self.imageView.image = image;
           //打印查看當前線程
            NSLog(@"刷新UI---%@",[NSThread currentThread]);
        });

    });

(4)GCD其它經常使用函數

01 柵欄函數(控制任務的執行順序)
    dispatch_barrier_async(queue, ^{
        NSLog(@"--dispatch_barrier_async-");
    });

    02 延遲執行(延遲·控制在哪一個線程執行)
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"---%@",[NSThread currentThread]);
    });

    03 一次性代碼(注意不能放到懶加載)
    -(void)once
    {
        //整個程序運行過程當中只會執行一次
        //onceToken用來記錄:該部分的代碼是否被執行過.若執行過,則不會進行操做.
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{

            NSLog(@"-----");
        });
    }

    04 快速迭代(開多個線程併發完成迭代操做)
       dispatch_apply(subpaths.count, queue, ^(size_t index) {
    });

    05 隊列組(同柵欄函數)
    //建立隊列組
    dispatch_group_t group = dispatch_group_create();
    //隊列組中的任務執行完畢以後,執行該函數
    dispatch_group_notify(dispatch_group_t group,
    dispatch_queue_t queue,
    dispatch_block_t block);
相關文章
相關標籤/搜索