信号量的详细用法,可以用此方法进行队列管理
-(void)dispatchSignal{//crate的value表示,最多几个资源可访问dispatch_semaphore_t semaphore = dispatch_semaphore_create(3);dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//任务1dispatch_async(quene, ^{dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);NSLog(@"run task 1");sleep(1);NSLog(@"complete task 1");dispatch_semaphore_signal(semaphore);});//任务2dispatch_async(quene, ^{dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);NSLog(@"run task 2");sleep(1);NSLog(@"complete task 2");dispatch_semaphore_signal(semaphore);});//任务3dispatch_async(quene, ^{dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);NSLog(@"run task 3");sleep(1);NSLog(@"complete task 3");dispatch_semaphore_signal(semaphore);});
}
队列组:
适用场景:分别异步执行2个耗时任务,然后当2个耗时任务都执行完毕后再回到主线程执行任务。这时候我们可以用到 GCD 的队列组。
- (void)groupNotify {NSLog(@"currentThread---%@",[NSThread currentThread]); // 打印当前线程NSLog(@"group---begin");dispatch_group_t group = dispatch_group_create();dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{// 追加任务1for (int i = 0; i < 2; ++i) {[NSThread sleepForTimeInterval:2]; // 模拟耗时操作NSLog(@"1---%@",[NSThread currentThread]); // 打印当前线程}});dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{// 追加任务2for (int i = 0; i < 2; ++i) {[NSThread sleepForTimeInterval:2]; // 模拟耗时操作NSLog(@"2---%@",[NSThread currentThread]); // 打印当前线程}});dispatch_group_notify(group, dispatch_get_main_queue(), ^{// 等前面的异步任务1、任务2都执行完毕后,回到主线程执行下边任务for (int i = 0; i < 2; ++i) {[NSThread sleepForTimeInterval:2]; // 模拟耗时操作NSLog(@"3---%@",[NSThread currentThread]); // 打印当前线程}NSLog(@"group---end");});
}
// dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// dispatch_async(queue, ^{
//
//
// });
//group的用法
APIHTTPService *httpService = [APIHTTPService sharedService];
__block NSError *blockError;
dispatch_group_t group = dispatch_group_create();
/* 先获取Token */
dispatch_group_enter(group);
[httpService fetchTokenWithCompletionHandler:^(NSString *token, NSError *error) {if (error) {NSLog(@"[MBStitchAPIService] Fetch token failed");blockError = error;}dispatch_group_leave(group);
}];
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);