美文网首页
GCD的使用

GCD的使用

作者: lym不解释 | 来源:发表于2017-01-22 11:06 被阅读10次

1.同步 主线程 串行 死锁

// MARK: 同步 主线程 串行 死锁
- (void)syncMain {
    NSLog(@"0");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"1 %@",[NSThread currentThread]);
    });
    NSLog(@"2 %@",[NSThread currentThread]);
    // 0
}

2.异步 主线程

// MARK: 1.异步 主线程(一般用做刷新UI操作) FIFO:(先进先出)
- (void)asyncMain {
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    dispatch_async(mainQueue, ^{
        NSLog(@"1 %@",[NSThread currentThread]);
    });
    dispatch_async(mainQueue, ^{
        NSLog(@"2 %@",[NSThread currentThread]);
    });
    dispatch_async(mainQueue, ^{
        NSLog(@"3 %@",[NSThread currentThread]);
    });
    // 1 2 3
}

3.线程通信

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
    // 耗时的操作  
    dispatch_async(dispatch_get_main_queue(), ^{  
        // 更新界面  
    });  
});

4.延迟执行

// GCD延迟执行
double delayTime = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayTime * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^{
    
});

// performSelector 延迟执行
[self performSelector:@selector(doSomeThing) withObject:self afterDelay:2];

// NSTimer 延迟执行 repeats:是否重复,设置为yes = 每2秒执行一次test
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(test) userInfo:nil repeats:NO];

5.组

// MARK: group_async
- (void)group_async {
    dispatch_group_t group = dispatch_group_create(); 
    dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0); 

    dispatch_group_async(group, globalQueue, ^{
        NSLog(@"1  %@",[NSThread currentThread]);
    });
    dispatch_group_async(group, globalQueue, ^{
        NSLog(@"2  %@",[NSThread currentThread]);
    });
    dispatch_group_async(group, globalQueue, ^{
        NSLog(@"3  %@",[NSThread currentThread]);
    });
    
    dispatch_group_notify(group, globalQueue, ^{

    });
    // 1 2 3 无序
}

6. 栅栏方法 dispatch_barrier_async

有时需要异步执行两组操作,而且第一组操作执行完之后才能开始执行第二组操作。如果没有dispatch_barrier_async这个方法,这4个任务执行是没有先后顺序的,完全随机,那么加上这个栅栏方法之后,会严格按照先随机顺序执行完栅栏之前的所有任务,然后再执行栅栏方法之后的任务。

dispatch_barrier_async 函数只有在 DISPATCH_QUEUE_CONCURRENT 队列中才起作用,
在全局并发队列 dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 中无效

// MARK: 栅栏方法 dispatch_barrier_async
- (void)dispatch_barrier_async {
    // 这里不能使用 dispatch_get_global_queue
    dispatch_queue_t queue = dispatch_queue_create("abc", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(queue, ^{
        NSLog(@"1  %@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"2  %@", [NSThread currentThread]);
    });
    
    // 子线程
    dispatch_barrier_async(queue, ^{ 
        NSLog(@"/ %@", [NSThread currentThread]);
    });
    
    // 主线程
//    dispatch_barrier_sync(queue, ^{
//        NSLog(@"// %@", [NSThread currentThread]);
//    });
    
    dispatch_async(queue, ^{
        NSLog(@"3  %@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"4  %@", [NSThread currentThread]);
    });
    //  1 2 / 3 4
}

相关文章

  • iOS-多线程:GCD

    GCD 简介 GCD 任务和队列 GCD 的使用步骤 GCD 的基本使用(6种不同组合区别) GCD 线程间的通信...

  • iOS多线程--彻底学会多线程之『GCD』

    GCD 文章目录 GCD简介 任务和队列 GCD的使用步骤 队列的创建方法 任务的创建方法 GCD的基本使用 并行...

  • iOS GCD

    GCD 简介 GCD 任务和队列 GCD 的使用步骤 GCD 的基本使用(六种组合不同区别,队列嵌套情况区别,相互...

  • 多线程之GCD

    GCD介绍 1、GCD简介 2、GCD任务和队列 3、GCD 的基本使用 4、GCD 线程间的通信 5、GCD 的...

  • iOS多线程--GCD篇

    GCD 文章目录GCD简介任务和队列GCD的使用步骤队列的创建方法任务的创建方法GCD的基本使用并行队列 + 同步...

  • iOS 关于GCD很详细的描述

    那为什么我们要使用 GCD 呢? 因为使用 GCD 有很多好处啊,具体如下:GCD 可用于多核的并行运算;GCD ...

  • GCD多线程详解

    1. GCD 简介 2. GCD 任务和队列 3. GCD 的使用步骤 4. GCD 的基本使用(6种不同组合区别...

  • iOS GCD的使用

    什么是GCD了解GCD前,需要了解的基础知识GCD的使用使用注意事项 -GCD学习前铺垫-什么是GCDGCD (G...

  • iOS - GCD

    目录 GCD简介 GCD核心概念 GCD队列的使用 GCD的常见面试题 GCD简介 Grand Central D...

  • iOS GCD的使用

    本文的主要内容是: 什么是GCD 了解GCD前,需要了解的基础知识 GCD的使用 使用注意事项 -GCD学习前铺垫...

网友评论

      本文标题:GCD的使用

      本文链接:https://www.haomeiwen.com/subject/vytobttx.html