多线程GCD

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

你可能感兴趣的:(多线程GCD)