您的位置:首页 > 移动开发 > IOS开发

iOS开发-线程篇-GCD其他方法

2020-01-15 10:00 1246 查看
2016-3-18   今天首先更新一下有关于GCD的其他常见应用。  

 1.GCD的应用 单例模式 这是我最开始接触的GCD应用 

-(void)gcdTest1

{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken,^{

        

        NSLog(@"%@",[NSThread currentThread]);

 

    });

    

}

 

2.延迟操作  

 

       在需要进行延迟的操作设置时可以使用GCD方式 ,但是使用的比较少,因为写起来比较麻烦 所以了解一下即可 ,第一种使用方法比较多。

    

-(void)gcdTest2

{

    

    //1. 延迟操作方法1

    // [self performSelector:@selector(doAction) withObject:nil afterDelay:2];

    

    //2. 延迟操作方法2

   

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

    

    //此处的写成主队列 dispatch_get_main_queue()

    

    //    when dispatch_time_t

    dispatch_after(time, dispatch_get_main_queue(), ^{

        

        //打印当前的线程

        NSLog(@"%@",[NSThread currentThread]);

    });

 

}

 

 

 

 3.创建调度组方式一 ( **** )          这个是CGD重要的应用,必须掌握,在开发中经常用到!(实现并发异步操作,即多线程执行)

-(void)gcdTest3

{

    

    // 创建调度组 ****  实现多线程 异步

    dispatch_group_t group = dispatch_group_create();

    

    //创建全局队列(并发)

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    

    //调度组进行异步请求 (异步进行 所以执行顺序不固定)

    dispatch_group_async(group, queue, ^{

        

        //设置时延

        [NSThread sleepForTimeInterval:2];

        

        NSLog(@"下载第一张图片");

        

    });

    dispatch_group_async(group, queue, ^{

        

        //设置时延

        [NSThread sleepForTimeInterval:2];

        

        NSLog(@"下载第二张图片");

        

    });

    dispatch_group_async(group, queue, ^{

        

        //设置时延

        [NSThread sleepForTimeInterval:2];

        

        NSLog(@"下载第三张图片");

        

    });

    dispatch_group_async(group, queue, ^{

        

        //设置时延

        [NSThread sleepForTimeInterval:2];

        

        NSLog(@"下载第四张图片");

        

    });

    

    //当所有异步请求完成时 调用dispatch_group_nofity

    dispatch_group_notify(group, queue, ^{

        

        NSLog(@"下载完成,更新UI");

        NSLog(@"%@",[NSThread currentThread]);

        

    });

    

}

 

 

4.创建调度组的方式二  (对比上述方法看)

    

    1.等待调度队列wait相当于一个阻塞状态

        2.DISPATCH_TIME_FOREVER 时间是永远

    3.wait一直等待上面完成之后再执行

 

-(void)gcdTest4

{

    

    dispatch_group_t group = dispatch_group_create();

    

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    

    //进入队列

    dispatch_group_enter(group);

    dispatch_async(queue, ^{

        

        NSLog(@"下载第一张图");

        //离开队列

        dispatch_group_leave(group);

    });

   

 

   dispatch_group_enter(group);

    dispatch_async(queue, ^{

        

        NSLog(@"下载第二张图");

        dispatch_group_leave(group);

    });

    

 

   dispatch_group_enter(group);

    dispatch_async(queue, ^{

        

        NSLog(@"下载第三张图");

        dispatch_group_leave(group);

    });

    

 

   dispatch_group_enter(group);

    dispatch_async(queue, ^{

        

        NSLog(@"下载第四张图");

        dispatch_group_leave(group);

    });

    

  

    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

    

    NSLog(@"更新UI");

 

}

 

 

5.中断操作

 

      注意这里使用 dispatch_barrier_async 的时候 必须使用自定义的并发队列 使用全局队列不好使

-(void)gcdTest5

{  

    //创建一个并发队列

     dispatch_queue_t queue = dispatch_queue_create("Chen-iOS", DISPATCH_QUEUE_CONCURRENT);

    //异步

    dispatch_async(queue, ^{

        //设置时间延迟

        [NSThread sleepForTimeInterval:2];

        NSLog(@"1");

    });

    dispatch_async(queue, ^{

        //设置时间延迟

        [NSThread sleepForTimeInterval:1];

        NSLog(@"2");

    });

    dispatch_async(queue, ^{

        //设置时间延迟

        [NSThread sleepForTimeInterval:3];

        NSLog(@"3");

    });

    

    //添加中断操作

    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//

     

    dispatch_barrier_async(queue, ^{

        

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

        [NSThread currentThread];

        

    });

    

    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//

    

    dispatch_async(queue, ^{

        //设置时间延迟

        [NSThread sleepForTimeInterval:5];

        NSLog(@"4");

    });

    dispatch_async(queue, ^{

        //设置时间延迟

        [NSThread sleepForTimeInterval:4];

        NSLog(@"5");

    });

    

 

}

  实现结果:  

6.遍历操作

 

-(void)gcdTest6

{

    //创建一个全局的队列

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    

    //iterations 遍历的次数

    dispatch_apply(5, queue, ^(size_t i) {

        

        NSLog(@"%@",@(i));

        

    });

 

}

         

转载于:https://www.cnblogs.com/Horkly/p/Horkly_GCD.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
banjiati9163 发布了0 篇原创文章 · 获赞 0 · 访问量 25 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: