10.7 GCD 串行列隊, 并行列隊

GCD

主要學習的知識點有:串行列隊,并行列隊,死鎖,group,柵欄

·串行列隊:A執行完,執行B,B執行完再執行C 排隊執行 SERIAL
·并行列隊:無序執行 CONCURRENT

·死鎖沒事少用同步方法,很容易造成主線程死鎖

·柵欄:AB可以無序執行,CD也可以無序執行,但是我們要AB執行完再執行CD,這樣我們就不好設置依賴關系了
·柵欄就可以擋在AB和CD的中間,等AB執行完了再執行CD

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

#if 0

//    主線程
    dispatch_queue_t mainQueue = dispatch_get_main_queue();

//    子線程  異步執行
    dispatch_queue_t subQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_async(subQueue, ^{
        
        NSLog(@"task");
    });
    
    NSLog(@"hello");

#endif
    
    
#if 0

    //異步執行
    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    for (NSInteger i = 0; i<100; i++) {
        
        dispatch_async(globalQueue, ^{
            
           
            NSLog(@"i = %ld",i);

        });
    }

#endif
    
    //自己創建一個新的線程

    dispatch_queue_t customQueue = dispatch_queue_create("apple.queue",DISPATCH_QUEUE_CONCURRENT);
   
#if 0

    dispatch_sync(customQueue, ^{
        
        NSLog(@"task");
    });

    NSLog(@"hello");

#endif

   
#if 0

    // 串聯列隊 有序執行打印 i = 0, i = 1, i = 2....    DISPATCH_QUEUE_SERIAL

    customQueue = dispatch_queue_create("apple.queue2", DISPATCH_QUEUE_SERIAL);
    
    customQueue = dispatch_get_main_queue();
    
    for (NSInteger i = 0; i<100; i++) {
    
        dispatch_async(customQueue, ^{
            
            NSLog(@"i = %ld",i);
        });
    }
    
    NSLog(@"hello world");

#endif
    
#if 0
    
    NSLog(@"hello world");
    //典型的死鎖    dispatch等待main打印"welcome",而打印這個方法是在主線程,造成死鎖
    //主線程執行dispatch,dispatch又要用到主線程,進入一個死循環中,死鎖
    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"welcome");
        
    });

    NSLog(@"======");
#endif 
   
#if 0

    //并聯列隊     無序執行,我們并不知道哪個先執行完                DISPATCH_QUEUE_CONCURRENT
    dispatch_queue_t queue = dispatch_queue_create("apple.queu3", DISPATCH_QUEUE_CONCURRENT);

   dispatch_async(queue, ^{
      
       NSLog(@"1");
   });
   
    dispatch_async(queue, ^{
        
        NSLog(@"2");
    });

    dispatch_async(queue, ^{
        
        NSLog(@"3");
    });

    NSLog(@"done");
    
#endif
    
#if 0
    
    dispatch_group_t group = dispatch_group_create();

    dispatch_queue_t queue = dispatch_queue_create("apple.queu3", DISPATCH_QUEUE_CONCURRENT);

    dispatch_group_async(group, queue, ^{
        
        NSLog(@"1");
    });
    
    //group_notify不能放在最上面,group里為空時就會執行,放在group最上面的話就為空,其他group_async方法還沒有調用它就會先執行
    //所有異步方法執行完后,打印"done"
    dispatch_group_notify(group, queue, ^{
       
        NSLog(@"done");
    });

    //異步方法中又有異步方法,比如網絡請求,group有可能不知道什么時候才執行notify
    dispatch_group_async(group, queue, ^{
        
        //所以我們設置一個標記,在開始這個異步方法前enter
        dispatch_group_enter(group);
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            
            NSLog(@"2");
            //執行完后leave
            dispatch_group_leave(group);
        });
    });

    dispatch_group_async(group, queue, ^{
        
        NSLog(@"3");
        
    });

    dispatch_group_async(group, queue, ^{
        
        NSLog(@"4");
        
    });

    dispatch_group_async(group, queue, ^{
        
        NSLog(@"5");
        
    });

#endif
   
    dispatch_queue_t queue = dispatch_queue_create("apple.queu3",DISPATCH_QUEUE_CONCURRENT);

#if 0

    //一個異步方法,比如說網絡下載
    dispatch_async(queue, ^{

        //下載data...
        NSData *data;//....
        
        //當我們要顯示時一定要在主線程里面執行
        dispatch_async(dispatch_get_main_queue(), ^{
            //主線程中顯示圖片
            UIImage *image = [UIImage imageWithData:data];
            
        });
    });

#endif
    
#if 0
    //1、2可以無序執行,3、4也可以無序執行,但是我們要1、2執行完再執行3、4.  這樣我們就不好設置依賴關系了

    dispatch_async(queue, ^{
        
        NSLog(@"1");
    });   
    
    dispatch_async(queue, ^{
        
        NSLog(@"2");
    });

    //柵欄就可以擋在1、2和3、4的中間,等1、2執行完了再執行3、4

    dispatch_barrier_async(queue, ^{
        
        NSLog(@"barrier");
    });
    
    dispatch_async(queue, ^{
        
        NSLog(@"3");
    });

    dispatch_async(queue, ^{
        
        NSLog(@"4");
    });

#endif

}

@end
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 從哪說起呢? 單純講多線程編程真的不知道從哪下嘴。。 不如我直接引用一個最簡單的問題,以這個作為切入點好了 在ma...
    Mr_Baymax閱讀 2,831評論 1 17
  • 多線程 在iOS開發中為提高程序的運行效率會將比較耗時的操作放在子線程中執行,iOS系統進程默認啟動一個主線程,用...
    郭豪豪閱讀 2,617評論 0 4
  • 1. GCD簡介 iOS開發中多線程的API主要有pthread,NSThread,NSOperation和GCD...
    安東_Ace閱讀 1,296評論 0 6
  • 1.一天爸爸要帶著樂比和悠悠去兜風,卻發現車子不動了。 2.于是,爸爸看了看發動機,居然發動機沒有問題。 3.于是...
    花花校長閱讀 695評論 0 0
  • 習慣于晚上睡前登陸公眾平臺,看看有沒有新的消息,有沒有新的面孔,有沒有熟悉的面孔離我而去。 我的生活已經恢復到應該...
    七月天閱讀 907評論 1 0