1:GCD
创建队列:
串行队列:
dispatch_queue_t queue=dispatch_queue_creat(@"lac.jianshu.weibo",DISPATCH_QUEUE_SERIAL);
GCD提供两种Dispatch Queue, 分别为Concurrent Dispatch Queue 和 Serial Dispatch Queue.
Serial Dispatch Queue 使用一个thread,默认为nil。
Concurrent Dispatch Queue 使用多个thread。
如果是对数据库表更新或更新文件,最好为每一个表或文件建立一个Serial Dispatch Queue,这样能保证只有一个thread会对数据进行更新。
如果对那些不会引起数据不一致问题的任务,需要放到Concurrent Dispatch Queue执行。
dispatch_sync(queue, ^{});
全局队列:
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_get_gloabal_queue 的第一个参数为枚举类型(默认为0),决定任务的优先级 ,第二个参数为Apple保留参数,传0
#define DISPATCH_QUEUE_PRIORITY_HIGH 2
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN(后台任务,优先级最低)
主队列 :dispatch_queue_t main_queue=dispatch_get_main_queue();
延时3秒加载:dispatch_time_t time=dispatch_time(DISPATCH_TIME_NOW,3*NSEC_PER_SEC);
dispatch_after(time, dispatch_get_main_queue(),^{
NSLog(@"after 3 seconds...");});
dispatch_set_target_queue: 主要用来给新建的queue设置优先级
dispatch_set_target_queue(queue1,系统queue2);
第一个参数是自定义的queue1,而不是系统的queue。因为你不能给系统的queue设置权限。通过上面设置,queue1 就有了与系统queue2一样的优先级。其实这个函数不仅可以设置queue的优先级,还可以设置queue之间的层级结构。
dispatch_group_notify 可以在group中的dispatch queue都执行完之后,通过一个dispatch_group_notify通知回调
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{NSLog(@"task1");});
dispatch_group_async(group, queue, ^{NSLog(@"task2");});
dispatch_group_async(group, queue, ^{NSLog(@"task3");});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"finished...");});
dispatch_barrier_async
dispatch_barrier_async是一个可以让当前任务等待queue其他任务完成再执行的函数。例如,从数据库读取数据是可以多线程并发读取的,因为这样提高效率。但是,更新数据库数据,就要保证只有一个线程进行更新操作。所以,当更新操作发生的时候,一定要保证读操作和其他更新操作等待。
dispatch_onece 保证了dispatch_once中的代码只会被执行一次,常用于单例。
dispatch semaphore 是一个信号量的counter,当counter为0,当前线程停止运行,当大于0,自减1,继续执行。
dispatch_semaphore_wait dispatch_semaphore_signal
dispatch_semaphore_signal
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);所以在下面的代码中,就可以保证在wait和signal中的[array addObject:[NSNumber numberWithInt:i]]; 就只有一个thread进行操作,保证了线程安全
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
NSMutableArray *array = [[NSMutableArray alloc] init];
for (int i = 0; i < 100000; i++)
{
dispatch_async(queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[array addObject:[NSNumber numberWithInt:i]];
dispatch_semaphore_signal(semaphore);
});
}
dispatch_apply
dispatch_apply用于给一个block添加到dispatch queue若干次。 “for”循环
dispatch_suspend/dispatch_resume
用于暂停和继续执行queue