常用GCD梳理(-)

一:異步、同步

1.dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

異步執行

例如: 會立即返回,同時把block裏面加載的東西放在後臺執行。  執行完畢之後 在main(主線程)裏面刷新UI頁面。

//    dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//    dispatch_queue_t mainQ = dispatch_get_main_queue();
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
                NSURL *url = [NSURL URLWithString:@"http://www.ytxww.com/upload/image/201203/20120309100442708165.jpg"];
                _img = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
                _img = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
          在main(主線程)裏面刷新UI頁面
dispatch_async(dispatch_get_main_queue(), ^{
            _imgv.image = _img;
        });
    });

同樣:

2.dispatch_sync(dispatch_queue_t queue>,(void)block)爲同步執行,和異步不同的是要執行完block塊之後才返回,然後進行下面的操作。


二。dispatch_apply

按照一定次數(size_t iterations)循環,隊列本身決定同步或者異步執行

dispatch_apply(size_t iterations,dispatch_queue_t queue,void (^block)(size_t));

因爲是全部執行完之後才返回,然後繼續執行下面的操作,所以,如果在dispatch_async(異步)裏面添加dispatch_apply可以出現dispatch_sync(同步)的效果。如下:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        dispatch_apply(5, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {
            NSLog(@"%zu",index);
        });
        NSLog(@"會執行五次apply之後,才執行此次打印");
    });

三。dispatch_after

延遲執行,    延遲5秒執行打印

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

        NSLog(@"after do");

    });


四。 

1.dispatch_barrier_async

dispatch_barrier_async(dispatch_queue_t queue,dispatch_block_t block);

作用如其名-->阻礙。

如下:不管barrier block裏面需要多久,3,4都會在barrier執行完之後執行。

  dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^(){
        NSLog(@"1");
    });
    dispatch_async(queue, ^(){
        NSLog(@"2");
    });
    dispatch_barrier_async(queue, ^(){
        NSLog(@"barrier");
        dispatch_apply(10, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {
            NSLog(@"......");
        });
    });
    dispatch_async(queue, ^(){
        NSLog(@"3");
    });
    dispatch_async(queue, ^(){
        NSLog(@"dispatch-4");
    });


2.dispatch_barrier_sync

dispatch_barrier_async,大同小異,只是用在同步或者異步的區別。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章