iOS 开发

IOS GCD详解

2018-07-16  本文已影响0人  小生不cai

1.首先我们搞清楚一下同步与异步的概念

同步执行(sync)

同步添加任务到指定的队列中,在添加的任务执行结束之前,会一直等待,直到队列里面的任务完成之后再继续执行。

只能在当前线程中执行任务,不具备开启新线程的能力。

异步执行(async):异步添加任务到指定的队列中,它不会做任何等待,可以继续执行任务。

可以在新的线程中执行任务,具备开启新线程的能力。

2.其次是要搞清楚并发队列与串行队列

串行队列(Serial Dispatch Queue)

每次只有一个任务被执行。让任务一个接着一个地执行。(只开启一个线程,一个任务执行完毕后,再执行下一个任务)

并发队列(Concurrent Dispatch Queue)

可以让多个任务并发(同时)执行。(可以开启多个线程,并且同时执行任务)

2.几种常用GCD的使用

们在创建单例、或者有整个程序运行过程中只执行一次的代码时,我们就用到了 GCD 的 dispatch_once 函数。如:

+ (DBManager *)sharedInstance{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        _sharedInstance = [[self alloc] init];

    });

    return _sharedInstance;

}

快速迭代dispatch_apply,按照指定的次数将指定的任务追加到指定的队列中,并等待全部队列执行结束。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

NSLog(@"apply---begin");

 dispatch_apply(6, queue, ^(size_t index) {

        NSLog(@"%zd---%@",index, [NSThreadcurrentThread]); 

 });

NSLog(@"apply---end");

队列组dispatch_group,我们常常需要这样一种操作:开一些线程,等待这些线程执行完了再继续下一步操作,这时我们可以用dispatch_group。

dispatch_queue_t dispatchQueue = dispatch_queue_create("ted.queue.next", DISPATCH_QUEUE_CONCURRENT);

    dispatch_group_t dispatchGroup = dispatch_group_create();

    dispatch_group_async(dispatchGroup, dispatchQueue, ^(){

        NSLog(@"dispatch-1");

    });

    dispatch_group_async(dispatchGroup, dispatchQueue, ^(){

        NSLog(@"dspatch-2");

    });

    dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){

        NSLog(@"end");

    });

延迟执行dispatch_after,

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

    });

上一篇下一篇

猜你喜欢

热点阅读