美文网首页
GCD 几个简单用法

GCD 几个简单用法

作者: 第三天 | 来源:发表于2017-11-13 17:12 被阅读6次

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

-(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(@"准备取消第二个任务");

}

相关文章

  • GCD 几个简单用法

    自己创建队列中 并发+异步 -(void)test5 { dispatch_group_t group = dis...

  • GCD几种简单用法

    //1.同步顺序执行 - (void)test1 { dispatch_async(mainQueue, ^{ [...

  • gcd的简单用法(持续更新)

    简单介绍 1、gcd相关简单用法;内容简单,牛绕行! 2、方法直出,不涉及过多理论东西;如需理论,自行百度; 3、...

  • dispatch_group和dispatch_barrier的

    前天被人问到使用GCD做依赖的用法,结果完全答不上来,下来之后就搜索了一下GCD的高级用法,发现自己对于GCD的掌...

  • 简单[GCD]用法详细总结(上)

    原文链接:https://www.jianshu.com/p/2d57c72016c6 本文用来介绍 iOS 多...

  • 简单[GCD]用法详细总结(下)

    原文链接:https://www.jianshu.com/p/2d57c72016c6本文用来介绍 iOS 多线程...

  • iOS面试--GCD常见用法

    项目中常见的GCD用法有已下几种: 1.GCD栅栏函数2.GCD快速迭代(遍历)3.GCD队列组的使用 1.GCD...

  • GCD基本使用方法

    项目中除了单例模式使用到了GCD,其他的地方很少用到,今天就把GCD的基本用法简单的整理一下。偏底层的代码用的少就...

  • GCD

    iOS多线程 Swift4 GCD深入解析swift GCD 的一些高级用法GCD 之线程组(Dispatch G...

  • iOS - GCD中的定时器

    GCD定时器优点:① GCD定时器不受RunLoop约束② 比NSTimer更加准时。 GCD定时器用法敲 dis...

网友评论

      本文标题:GCD 几个简单用法

      本文链接:https://www.haomeiwen.com/subject/nwwzmxtx.html