iOS GCD

Dispatch Queue

//1.串行队列
    //1.1系统提供的主队列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    //1.2自定义串行队列
    dispatch_queue_t serialQueue = dispatch_queue_create("com.cjnwan", DISPATCH_QUEUE_SERIAL);
//2.并行队列
    //2.1系统提供的并行队列
    dispatch_queue_t highGlobalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);//高优先级
    dispatch_queue_t defaultGlobalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//默认优先级
    dispatch_queue_t lowGlobalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);//低优先级
    dispatch_queue_t backGlobalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);//后台线程
    //2.2自定义并行队列
    dispatch_queue_t global = dispatch_queue_create("com.cjnwan", DISPATCH_QUEUE_CONCURRENT);

dispatch_set_targte_queue

dispatch_queue_create生成的都是默认优先级的

延迟执行

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    
});

Dispatch Group

dispatch_queue_t queue = dispatch_queue_create("com.cjnwan", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();


dispatch_group_async(group, queue, ^{// dispatch_group_async等价于dispatch_group_enter() 和 dispatch_group_leave()的组合
    
});
dispatch_group_async(group, queue, ^{// dispatch_group_enter() 必须运行在 dispatch_group_leave() 之前
    
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);//wait方式
dispatch_group_notify(group, dispatch_get_main_queue(), ^{//notify方式
    
});

dispatch_barrier_async

dispatch_queue_t queue = dispatch_queue_create("com.cjnwan", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
    
});
dispatch_async(queue, ^{
    
});
dispatch_barrier_async(queue, ^{
    
});
dispatch_async(queue, ^{
    
});
dispatch_async(queue, ^{
    
});

dispatch_sync

  • 在当前的线程同步执行

dispatch_apply

dispatch_queue_t queue = dispatch_queue_create("com.cjnwan", DISPATCH_QUEUE_CONCURRENT);
dispatch_apply(10, queue, ^(size_t i) {
    
});//会阻塞线程

dispatch_suspend/dispatch_resume

  • 挂起和恢复

Dispatch Semaphore

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_CONCURRENT, 0), ^{
    //....
    dispatch_semaphore_signal(semaphore);
});
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);

dispatch_once

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    
});//dispatch_queue_set_specific (FMDB) 

避免死锁

OSAtomic原子操作

int32_t value =0;
OSAtomicIncrement32(&value);
OSAtomicDecrement32(&value);

NSLock互斥锁

NSLock lock = [[NSLock alloc]init];
if([lock tryLock]){
    //...
    [lock unlock];
}

NSRecursiveLock(递归锁)

 NSRecursiveLock * lock = [[NSRecursiveLock alloc] init];
for(int i=0;i<10;i++){
 [lock lock];
 //...
 [lock unlock];
}

@synchronized

@synchronized(self){
    //...
}

推荐阅读更多精彩内容

  • 一. 重点: 1.dispatch_queue_create(生成Dispatch Queue) 2.Main D...
    BestJoker阅读 1,465评论 2 2
  • 一、GCD的API 1. Dispatch queue 在执行处理时存在两种Dispatch queue: 等待现...
    doudo阅读 420评论 0 0
  • GCD笔记 总结一下多线程部分,最强大的无疑是GCD,那么先从这一块部分讲起. Dispatch Queue的种类...
    jins_1990阅读 626评论 0 1
  • 简介 GCD(Grand Central Dispatch)是在macOS10.6提出来的,后来在iOS4.0被引...
    sunmumu1222阅读 707评论 0 2
  • 1、主线程队列 VS 分线程队列 dispatch_sync 和 dispatch_async 区别: dispa...
    瑞小萌阅读 751评论 4 7