文章标题

来源:互联网 发布:数据统治世界 百度云 编辑:程序博客网 时间:2024/05/20 12:48

GCD常见的一些基础用法(待更新)

总结一下,GCD的常见用法,主要包括以下几个类别:
1 单例

+ (instancetype)sharedClient {    static Class *_sharedClient = nil;    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        _sharedClient = [[Class alloc] init];    });    return _sharedClient;}

很固定的一种模式,主要用于仅需要执行一次的地方。

2 延后执行

- (void)refresh{    double delayInSeconds = 2.0;    dispatch_time_t timeDelay = dispatch_time(DISPATCH_TIME_NOW, (int64_t) (delayInSeconds * NSEC_PER_SEC));    dispatch_after(timeDelay, dispatch_get_main_queue(), ^(void){        [self refreshTable];    });}

顾名思义,当你需要让代码延迟多少秒后执行,可以用到这种方式。

3 同步线程执行和异步线程执行

同步线程:

void dispatch_sync(   dispatch_queue_t queue,   dispatch_block_t block);

异步线程:

void dispatch_async(   dispatch_queue_t queue,   dispatch_block_t block);

参数queue是你准备用到的线程,分为串行队列和并行队列;
串行队列:
最常用到的是dispatch_get_main_queue(),也就是系统默认主线程。也可以自己创建,用

dispatch_queue_t serialQueue = dispatch_queue_create(queueName,DISPATCH_QUEUE_SERIAL);

使用串行队列会顺序执行,也就是前面的执行完毕才会执行后面的,这个一在需要更新UI的时候用。

并行队列:
使用dispatch_get_global_queue获得系统的全局队列:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

也可以自己创建:

 dispatch_queue_t queue = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT);

4 dispatch_barrier_async 的使用
barrier,意思就是栅栏,设置一个栅栏,任务会等到前面的完成,并且自己执行完毕以后才会执行后面的任务。
用法和别的一样,如下

    dispatch_barrier_async(queue, ^{      });  

5 组的使用
有时候,当你需要把一些异步的 block 组合起来去完成一个任务的时候,可以用”groups” 去完成这项任务。

    func groupGCD(){        let group = dispatch_group_create()        let queue = dispatch_get_global_queue(0, 0)        dispatch_group_async(group, queue) {            self.content = "a"        }        dispatch_group_async(group, queue) {             self.content = "b"        }        dispatch_group_notify(group, queue) {             print("\(self.content)")        };    }
0 0
原创粉丝点击