GCD 几个简单用法

自己创建队列中 并发+异步

-(void)test5

{

dispatch_group_t group = dispatch_group_create();

dispatch_queue_t queue = dispatch_queue_create("com.gcd-group.www", DISPATCH_QUEUE_CONCURRENT);

dispatch_group_async(group, queue, ^{

for(NSInteger i = 0; i < 1000; i++) {

if(i == 999) {

NSLog(@"11111111");

}

}

});

dispatch_group_async(group, queue, ^{

NSLog(@"22222222");

});

dispatch_group_async(group, queue, ^{

NSLog(@"33333333");

});

dispatch_group_notify(group, queue, ^{

NSLog(@"done");

});

}

全局并发队列异步+信号量(是否创建队列)

-(void)test4

{

//crate的value表示,最多几个资源可访问

dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);

dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

NSLog(@"%@",semaphore);

//任务1

dispatch_async(quene, ^{

NSLog(@"run task 01");

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, ^{

NSLog(@"run task 02");

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, ^{

NSLog(@"run task 03");

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

NSLog(@"run task 3");

sleep(1);

NSLog(@"complete task 3");

dispatch_semaphore_signal(semaphore);

});

}


dispatch_group_enter  dispatch_group_leave  使用

-(void)test3

{

dispatch_queue_t conCurrentQueue =  dispatch_queue_create("conCurrentQueue", DISPATCH_QUEUE_CONCURRENT);

dispatch_group_t group = dispatch_group_create();

dispatch_group_enter(group);

dispatch_async(conCurrentQueue, ^{

NSLog(@"任务一开始");

[NSThread sleepForTimeInterval:2];

NSLog(@"任务一快结束");

dispatch_group_leave(group);

});

dispatch_group_enter(group);

dispatch_async(conCurrentQueue, ^{

NSLog(@"任务二开始");

[NSThread sleepForTimeInterval:2];

NSLog(@"任务二快结束");

dispatch_group_leave(group);

});

dispatch_group_notify(group, conCurrentQueue, ^{

NSLog(@"被通知任务开始");

});

NSLog(@"-----");

}

dispatch_group_wait

-(void)test2{

dispatch_queue_t conCurrentQueue =  dispatch_queue_create("conCurrentQueue", DISPATCH_QUEUE_CONCURRENT);

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, conCurrentQueue, ^{

NSLog(@"任务一开始");

[NSThread sleepForTimeInterval:2];

NSLog(@"任务一快结束");

});

dispatch_group_async(group, conCurrentQueue, ^{

NSLog(@"任务二开始");

[NSThread sleepForTimeInterval:6];

NSLog(@"任务二快结束");

});

dispatch_time_t time=dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC));

long result=dispatch_group_wait(group, time);

if (result==0) {

NSLog(@"组的block全部执行完成");

}

else{

NSLog(@"组的block没有全部执行完成,是timeout返回");

}

NSLog(@"-----------");

}

dispatch_block_cancel

-(void)test1

{

#pragma mark ---------- block  和 cancle

dispatch_queue_t myQueue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_SERIAL);

// 耗时任务

dispatch_block_t firstBlock = dispatch_block_create(0, ^{

NSLog(@"开始第一个任务:%d",[NSThread isMainThread]);

[NSThread sleepForTimeInterval:1.5f];

NSLog(@"结束第一个任务");

});

// 耗时任务

dispatch_block_t secBlock = dispatch_block_create(0, ^{

NSLog(@"开始第二个任务:%d",[NSThread isMainThread]);

[NSThread sleepForTimeInterval:2.f];

NSLog(@"结束第二个任务");

});

dispatch_async(myQueue, firstBlock);

dispatch_async(myQueue, secBlock);

// 等待 1s,让第一个任务开始运行,因为myQueue是串行队列,遵守fifo先进先出的规则,所以必须先执行完block1,才能执行block2

[NSThread sleepForTimeInterval:1];

NSLog(@"休眠:%d",[NSThread isMainThread]);

dispatch_block_cancel(firstBlock);

NSLog(@"准备取消第一个任务");

dispatch_block_cancel(secBlock);

NSLog(@"准备取消第二个任务");

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Managing Units of Work(管理工作单位) 调度块允许您直接配置队列中各个工作单元的属性。它们还...
    edison0428阅读 8,208评论 0 1
  • 0. Description iOS SDK >= 6.0且开启ARC,GCD对象就不应该使用dispatch_r...
    barbere阅读 419评论 0 0
  • 简介 GCD(Grand Central Dispatch)是在macOS10.6提出来的,后来在iOS4.0被引...
    sunmumu1222阅读 950评论 0 2
  • 1、主线程队列 VS 分线程队列 dispatch_sync 和 dispatch_async 区别: dispa...
    瑞小萌阅读 1,001评论 4 7
  • NSThread 第一种:通过NSThread的对象方法 NSThread *thread = [[NSThrea...
    攻城狮GG阅读 943评论 0 3

友情链接更多精彩内容