GCD使用信号量(网络并发机制)

信号量是用来协调进程对共享资源的访问的;

GCD使用信号量有三种方式:

1、dispatch_group

dispatch_group_enter(group)和dispatch_group_leave(group),enter和leave必须配合使用,有几次enter就要有几次leave,否则group会一直存在.当所有enter的block都leave后,会执行dispatch_group_notify的block。

dispatch_group_t group = dispatch_group_create();

dispatch_group_enter(group);    

dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{         NSLog(@"请求1");       dispatch_group_leave(group);     });

dispatch_group_enter(group);    

dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{         NSLog(@"请求2");        

dispatch_group_leave(group);     });

dispatch_group_notify(group, dispatch_get_main_queue(), ^{        

//界面刷新        

NSLog(@"请求完成,刷新界面");    

});

2、dispatch_barrier

(栅栏函数)dispatch_barrier_async函数的作用是等待所有位于barrier函数之前的操作执行完毕后执行,并且在barrier函数执行之后,barrier函数之后的操作才会得到执行.

dispatch_queue_t queue = dispatch_queue_create("10", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{         NSLog(@"---1---");     });

dispatch_async(queue, ^{         NSLog(@"---2---");     });

dispatch_barrier_async(queue, ^{         NSLog(@"---barrier---");     });

dispatch_async(queue, ^{         NSLog(@"---3---");     }); 

dispatch_async(queue, ^{         NSLog(@"---4---");     }); 

3、dispatch_semaphore

//创建信号量,参数:信号量的初值,如果小于0则会返回NULL

 dispatch_semaphore_create(信号量值)

 //等待降低信号量

 dispatch_semaphore_wait(信号量,等待时间)

 //提高信号量

 dispatch_semaphore_signal(信号量)

 正常的使用顺序是先降低然后再提高

// 创建队列组     dispatch_group_t group = dispatch_group_create();

// 创建信号量,并且设置值为2,crate的value表示,最多几个资源可访问     dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//任务1     dispatch_async(quene, ^{         dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);         NSLog(@"run task 1");         sleep(1);         NSLog(@"complete task 1");         dispatch_semaphore_signal(semaphore);     });

//任务2     dispatch_async(quene, ^{         dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);         NSLog(@"run task 2");         sleep(1);         NSLog(@"complete task 2");         dispatch_semaphore_signal(semaphore);     });

//任务3     dispatch_async(quene, ^{         dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);         NSLog(@"run task 3");         sleep(1);         NSLog(@"complete task 3");         dispatch_semaphore_signal(semaphore);     });

//任务4     dispatch_async(quene, ^{         dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);         NSLog(@"run task 4");         sleep(1);         NSLog(@"complete task 4");         dispatch_semaphore_signal(semaphore);     });

你可能感兴趣的:(GCD使用信号量(网络并发机制))