iOS多线程之GCD的基本使用

  • 使用GCD开发的基本思路

基本思想:将任务(操作)放在队列中去执行

任务使用block定义

队列负责调度任务执行所在的线程以及具体的执行时间

队列的特点是先进先出(FIFO)的,新添加至队列的操作都会排在队尾.

GCD的函数都是以dispatch开头的

注意 :队列不是线程,也不对应CPU。

队列:dispatch_queue_t

两种队列:串行队列、并行队列

队列上的操作:添加任务

两种任务:同步任务、异步任务

  • 队列及任务

GCD的串行队列,意味着队列中的任务排队执行

1)添加异步任务:创建一个线程,所有被添加的任务排队执行

dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_SERIAL);
for ( int i=0; i<10; i++) {
    dispatch_async(q, ^{
        NSLog(@"%@ %d", [NSThread currentThread], i);
    });
}

2)添加同步任务:不创建线程,任务在当前线程中执行,极少使用

dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_SERIAL);
dispatch_sync(q, ^{
    NSLog(@"%@ %d", [NSThread currentThread], i);
});

CGD并行队列,意味着队列中任务不会排队执行,随机执行

1)添加异步任务:会创建线程,个数不确定,任务的先后顺序不确定

dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(q, ^{
    NSLog(@"%@ %d", [NSThread currentThread], i);
});

2)添加同步任务:不会创建线程,极少使用

dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(q, ^{
    NSLog(@"%@ %d", [NSThread currentThread], i);
});

无论什么队列和什么任务,线程的创建和回收都不需要程序员参与,线程的创建和回收是由队列负责的

  • 全局队列

GCD的最常用队列是全局队列和主队列,这两种队列不需要创建,是每个App都具有的

获得全局队列

dispatch_queue_t dispatch_get_global_queue( long identifier, unsigned long flags);

flags参数:保留参数,传0即可

identifier参数:用于指定使用哪种全局队列

四种全局队列:

#define DISPATCH_QUEUE_PRIORITY_HIGH 2          //高优先级

#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0       //默认优先级

#define DISPATCH_QUEUE_PRIORITY_LOW (-2)        //低优先级

#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN //最低的后台优先级

全局队列是系统的,拿过来直接用即可,都是并行队列

添加异步任务,会创建多个线程,任务无须执行

添加同步任务,不会创建新线程,任务排序执行

  • 主队列

每一个应用程序都只有一个主线程,在iOS开发中,所有UI的更新操作,都必须在主线程中去做

获得主队列:

dispatch_queue_t dispatch_get_main_queue(void);

主队列也是系统的,拿过来直接用即可,添加的任务都会在主线程终止hi性

添加异步任务:在主线程中顺序执行,无异步效果

添加同步任务:任务不会执行

常见的用法:

如果一个任务想要在后台(子线程)执行,则使用全局队列添加异步任务

如果一个任务想要在主线程执行,则使用主队列添加同步任务

  • 异步下载图片

这是一类最常见的做法,在子线程中请求数据,完成后回到主线程中更新相关的UI元素

  • GCD的一些其他常用操作

1)任务的延迟执行

dispatch_after函数会延迟将一个block任务添加到队列中

void dispatch_after( dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block);

在Xcode中,通过快捷键补全的代码:

delayInSeconds:延迟的秒数

使用的主队列,即延迟的任务在主线程中执行

最后的block,即任务代码

2)任务的多次执行

dispatch_apply函数将一个任务放到队列中多次执行

具体是串行执行还是并行执行是由具体的队列决定。

dispatch_apply不会立刻返回,在执行完毕后才返回,是同步的调用

void dispatch_apply( size_t iterations, dispatch_queue_t queue, void (^block)( size_t));

iteractions:执行的次数

queue:队列,一般使用全局队列

block:任务代码

应用场景:将关系不紧密的循环操作放到后台运行


3)保证任务只执行一次

在多线程的环境下,同故宫dispatch_once()保证一个任务只会执行一次

在Xcode中,通过快捷键补全的代码:

在block中添加任务代码即可

应用场景:单例对象的创建

时间: 2024-10-08 08:32:16

iOS多线程之GCD的基本使用的相关文章

iOS多线程之GCD小记

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

(五十五)iOS多线程之GCD

GCD的全称为Grand Central Dispatch,翻译为大中央调度,是Apple开发的一个多线程编程解决方法. 进程和线程的概念: 正在进行中的程序被称为进程,负责程序运行的内存分配,每一个进程都有自己独立的虚拟内存空间. 线程是进程中一个独立的执行路径,即主线程,主线程有1M的栈区,对于耗时的执行路径,可以放在子线程(512K栈区)中执行. Tip:新建线程会消耗内存空间和CPU事件,线程太多会降低系统的运行性能,多线程是通过CPU时分复用实现的. Tip:多线程是为了并发执行多项任

iOS多线程之GCD学习笔记

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

iOS 多线程之GCD的使用

在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列(dispatch queue).GCD会负责创建线程和调度你的任务,系统直接提供线程管理. 一.队列: 基本概念: 1.GCD的一个重要概念是队列,它的核心理念:将长期运行的任务拆分成多个工作单元,并将这些单元添加到dispath queue中,系统会为我们管理这些dispath queue,为我

ios多线程之GCD

** dispatch_after 延时操作应用场景 例如:游戏后台需要做一些随机的事件,需要在某个时间后,调用方法! 1> 调用的方法通常是跟UI有关的,例如提示用户等 2> 不了解GCD或者多线程的人,可以直接填空即可 */ - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self delay1]; } #pragma mark - 延时操作 /** 在其他线程中调用 dispatch_after */

Objective-C IOS多线程之GCD深入理解

在 GCD 中,加入了两个非常重要的概念:任务和队列一个线程是可以拥有多个执行队列的,所有任务是添加到队列中等待执行的主队列是特殊的串行队列,自己创建的队列可以指定串行或并行,全局队列是并行队列 任务:即操作,你想要干什么,说白了就是一段代码,在 GCD 中就是一个 Block,所以添加任务十分方便.任务有两种执行方式: 同步执行和异步执行,他们之间的区别主要在于会不会阻塞当前线程 首先看下面这两个例子: 1.dispatch_queue_t queue = dispatch_queue_cre

OC多线程之GCD

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

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

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

iOS 多线程之NSThread简单使用

1.线程的构建和开启: (1)_thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(threadOneMethod) object:nil]; _thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(threadTwoMethod) object:nil]; [_thread1 start]; [_thread2 start]; 先构建,然