GCD使用方法以及死锁研究

时间:2022-12-12 19:28:58

基础概念

串行:代码顺序执行
并行:多个任务同时执行(只是处理器多个任务间进行切换)
同步:多个线程需要操作一个资源时,同一时间只能一个线程操作,,其余需要等待其完成。
异步:多个线程操作时,不需等待前一个完成,直接进行下一步。

死锁出现情况

    NSLog(@"111");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"文城");
})
;
NSLog(@"金城");

打印出”111”,程序会报错。
因为在执行完”111”后,会等待block执行,但是block在主线程执行完后才会执行。

使用

1.延迟执行

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(延迟时间 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//做得事情
});

2.单列

+(instancetype)getInstance{
static MyClass *object;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
objct = [[self alloc]init];
});
return object;
}

3.定时器

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
__weak __typeof__(self) weakSelf = self;
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 间隔时间 * NSEC_PER_SEC, 可推迟时间 * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, ^{

做得事情
if (条件) {
//取消定时器,必须加上,不然就不会回调
dispatch_cancel(timer);
}

});
//启用
dispatch_resume(timer);