iOS-线程之GCD---之GCD的几种常用常用的方法

GCD中几种常见的方法

1.代码只被执行一次:(利用这种方式,可以简单的创建一个单例对象)

方法dispatch_once(&,^(void){});

 1 - (void)testOne
 2
 3 {
 4
 5     static dispatch_once_t onceToken;
 6
 7     dispatch_once(&onceToken,^{
 8
 9         NSLog(@"代码块只执行了一次");
10
11     });
12
13 }

2.在两个线程之间执行一段代码,并且分离了线程,不会使它们同时执行

方法:dispatch_barrier_async(queue,^(void){});

 1 - (void)testBarrier
 2 {
 3     //队列不能是系统的并行队列
 4     dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
 5     //线程一
 6     dispatch_async(concurrentQueue, ^{
 7         for (int i=0; i<100; i++) {
 8             NSLog(@"线程一:%d",i);
 9         }
10     });
11     //线程二
12     dispatch_async(concurrentQueue, ^{
13         for (int i=0; i<100; i++) {
14             NSLog(@"线程二:%d",i);
15         }
16     });
17     //在线程一,线程二执行完成之后,在线程三执行之前执行一段代码,再开始执行线程三
18     dispatch_barrier_async(concurrentQueue, ^{
19         NSLog(@"barrier");
20     });
21
22     //线程三
23     dispatch_async(concurrentQueue, ^{
24         for (int i=0; i<100; i++) {
25             NSLog(@"线程三:%d",i);
26         }
27     });
28     //线程四
29     dispatch_async(concurrentQueue, ^{
30         for (int i=0; i<100; i++) {
31             NSLog(@"线程四:%d",i);
32         }
33     });
34 }

3.对此执行一段代码

方法:dispatch_apply(size_t t,queue,^(size_t times){});

block中的参数times是指当前执行的是队列中第几个线程,比如说:该方法要执行10次,就会在队列中创建10个线程,并且基本同时执行,times标识的就是当前第几个线程(所以times被打印是无序的).

 1 - (void)testApply
 2 {
 3     /*
 4      @param1 代码块执行的次数
 5      @param2 代码块所在的队列
 6      @param3 线程的执行体
 7      */
 8     size_t t = 10;
 9     dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
10
11     dispatch_apply(t, globalQueue, ^(size_t q){
12         NSLog(@"线程一:%ld",q);
13     });
14 }

4.代码在一段时间后执行

方法:dispatch_after(dispatch_time_t time,queue,^(void){});---time参数为当前时间的多少秒后去执行Block中的代码

 1 - (void)testAffter
 2 {
 3     NSLog(@"执行之前");
 4     //当前时间10秒之后
 5     dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 10);
 6     /*
 7      @param1:时间
 8      @param2:线程所在的队列
 9      @param3:线程的执行体
10      */
11     dispatch_after(time, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
12         NSLog(@"执行了after");
13     });
14 }

5.GCD还提供了组的概念,可以将所有队列(线程放在队列中)放到组中

当组中所有队列中的线程执行完后,将会执行dispatch_group_notify(dispatch_group_t group,queue,^(void){});方法中Block

作用:当一个页面需要多个下载时候,就可以将该将所有异步下载的线程添加到队列后再添加到组中,当完成了所有的下载,最后在dispatch_group_notify方法中重新刷新页面.

 1 //将线程放到一个组里面
 2 - (void)testGroup
 3 {
 4     //创建一个组
 5     dispatch_group_t group = dispatch_group_create();
 6
 7     dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 8     /*
 9      @param1:线程所在的组
10      @param2:线程所在的队列
11      @param3:线程的执行体
12      */
13     dispatch_group_async(group, globalQueue, ^{
14         for (int i=0; i<100; i++) {
15             NSLog(@"线程一:%d",i);
16         }
17     });
18     //在组中在添加一个线程
19     dispatch_group_async(group, globalQueue, ^{
20         for (int i=0; i<100; i++) {
21             NSLog(@"线程二:%d",i);
22         }
23     });
24
25     //在多有线程组里面的所有线程执行完成之后调用的代码
26     dispatch_group_notify(group, globalQueue, ^{
27         NSLog(@"线程所有的方法执行完成");
28     });
29 }

GCD如此强大,总有一款适合你..

时间: 2024-08-26 02:33:24

iOS-线程之GCD---之GCD的几种常用常用的方法的相关文章

C#多线程之Parallel中 类似于for的continue,break的方法

好久没写东西了,终于找到点知识记录下... 利用ParallelLoopState对象来控制Parallel.For函数的执行,ParallelLoopState对象是由运行时在后台创建的: Parallel.For(1, 100, (i, ParallelLoopState) =>{...}); 这个对象有两个函数,Stop和Break,可以分别用来控制Parallel.For的执行. 调用Stop,表示Parallel.For的执行立刻停止,无论其他执行单元是否达到停止的条件.而如果我们使用

iOS 线程之GCD的高级用法

之前的一篇关于线程的blog已经为大家介绍了GCD的简单使用方式及例子说明,今天由于项目中有特殊的应用GCD的实例,为大家介绍两种特殊需求的使用GCD的方法. 目的:实现一件事情做完,再做下一件事情,确保函数的执行周期. 解决方案:提供以下2种解决方案 1.创建barrier等待线程 dispatch_async(dispatch_get_main_queue(), ^{ [self ActionFirst]; }); dispatch_barrier_async(dispatch_get_ma

iOS多线程之GCD小记

iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言的,在在oc中使用时需要包含 #import<pthread.h> 使用这种多线程方案需要手动处理线程的各个状态的转换,也就是要管理线程的生命周期. 2.NSThread 这种多线程方案经过了苹果的封装,是一种面向对象的方案,因此可以直接操控线程对象,相对来说比较便捷,其生命周期也要手动管理 3.

iOS多线程之GCD学习笔记

什么是GCD 1.全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 2.纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 任务和队列 GCD中有2个核心概念 任务:执行什么操作 队列:用来存放任务 GCD的使用就2个步骤,首先确定定制任务(

OC多线程之GCD

要了解多线程首先要知道什么是进程,什么是进程? 正在进行中的程序被称为进程,负责程序运行的内存分配 每一个进程都有自己独立的虚拟内存空间 什么是线程: 线程是进程中一个独立的执行路径(控制单元) 一个进程中至少包含一条线程,即主线程 可以将耗时的执行路径(如:网络请求)放在其他线程中执行 创建线程的目的就是为了开启一条新的执行路径,运行指定的代码,与主线程中的代码实现同时运行 线程的优缺点: 优势 (1)充分发挥多核处理器优势,将不同线程任务分配给不同的处理器,真正进入“并行运算”状态 (2)将

OC多线程之GCD ----- 2

dispatch_create生成的Queue不管是并行队列还是串行队列,其优先级都是默认优先级 但是可以用dispatch_set_target_queue来改变队列的优先级 dispatch_set_target_queue(原来的队列, 目标优先级队列) 使用这个函数需要获取两个队列,一个是需要变更优先级的队列,一个是指定优先级的队列(指定优先级的队列可以通过get_global获得) 如果多个串行队列优先级相同,那么这些队列里的任务也会串行执行 dispatch_after函数并不能非常

多线程之pthread, NSThread, NSOperation, GCD

关于多线程会有一系列如下:多线程之概念解析 多线程之pthread, NSThread, NSOperation, GCD 多线程之NSThread 多线程之NSOperation 多线程之GCD pthread:跨平台,适用于多种操作系统,可移植性强,是一套纯C语言的通用API,且线程的生命周期需要程序员自己管理,使用难度较大,所以在实际开发中通常不使用. NThread:是苹果对pthread的一个封装.通过封装可以在Cocoa环境中,可以更简易地用多线程.线程的生命周期由程序员管理.每个N

iOS--多线程之GCD

GCD 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 3.提示 (1)GCD存在于libdispatch.dylib这个库中,这个调度库包含了GCD

多线程之GCD的理解

iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 3.提示 (1)GCD存在于libdispatch.dylib这个库中

iOS开发之多线程技术——GCD篇

本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & Asynchronous 同步 & 异步 二.Serial Queues & Concurrent Queues 串行 & 并发 三.Global Queues全局队列 四.Main Queue主队列 五.同步的作用 六.dispatch_time延迟操作 七.线程安全(单例dispa