GCD高级用法(三) 多线程单例

Swift多线程:GCD进阶,单例、信号量、任务组 其实方法有很多种,有OC心Swift皮的写法、新瓶装老酒的写法,那既然咱们开始了Swift,就抛下过去那写沉重包袱吧。它循环执行并行队列中的任务时,会开辟新的线程,不过有可能会在当前线程中执行一些任务。准确的理解是,等到指定的时间到了以后,才会开辟一个新的线程然后立即执行队列中的任务。DispatchGroup的职责就是当队列中的所有任务都执行完毕后,会发出一个通知来告诉告诉大家,任务组中所执行的队列中的任务执行完毕了。而是等时间了,才加入到线程中。如果一大堆任务执行着的时候,突然后面的任务不想执行的。 阅读详情

众所周知,在oc,ui学习过程中,会碰到许多个系统的单例类,例如 [UIApplication sharedApplication]   [NSFileManager defaultManager] ...它们跟之前自己在没学多线程创建的单例类有什么区别呢。主要是系统提供的单例类在多线程下创建出来的对象依旧是不变的。之前没学多线程所创建的单例,在多线程状况下是不安全的,它们创建出来的对象并不是唯一的。那才能创建出多线程下的单例呢,话不多说,直接码上:



#import <Foundation/Foundation.h>

//多线程里单例 多个线程内只能实例化出一个对象副本

@interface GCDSingle : NSObject


+ (id)allocWithZone:(NSZone *)zone;

@end



#import "GCDSingle.h"

@implementation GCDSingle

//多线程里单例 多个线程内只能实例化出一个对象副本

static GCDSingle *SharedInstance=nil;

+ (id)allocWithZone:(NSZone *)zone
{
    static dispatch_once_t onceToken;
    
    dispatch_once(&onceToken, ^{
        
        SharedInstance =[super allocWithZone:zone];
        
    });
    
    return SharedInstance;
}

@end



接下来在GCD测试一下


   //创建监听组
    dispatch_group_t group=dispatch_group_create();
    
    //创建队列
    dispatch_queue_t queue=dispatch_get_global_queue(0,0);
    
    //并发任务,执行顺序随机(测试多线程单例)
    dispatch_group_async(group, queue, ^{
        
        GCDSingle *object1=[[GCDSingle alloc] init];
        NSLog(@"object1:%@",object1); //object1:<GCDSingle: 0x7fbc8be071c0>
    });
    
    
    dispatch_group_async(group, queue, ^{
        
        GCDSingle *object2=[[GCDSingle alloc] init];
        NSLog(@"object2:%@",object2); //object2:<GCDSingle: 0x7fbc8be071c0>
    });
    
    
    dispatch_group_async(group, queue, ^{
        
        GCDSingle *object3=[[GCDSingle alloc] init];
        NSLog(@"object3:%@",object3); //object3:<GCDSingle: 0x7fbc8be071c0>
 
    });

    dispatch_group_notify(group, queue, ^{NSLog(@"done");});


   从打印结果来看 对象副本地址都是一样的。这样跟系统单例一样安全,实用的单例就创建好了。

iOS面试题(二十四)多线程 -- GCD 7.多线程 GCD(使用最多) NSOperation/NSOperationQueue(AFNetworking源码中所有网络请求任务都封装到NSOperation,提交到operationQueue中,SDWebImage也会涉及) NSThread(实现常驻线程) 线程同步、资源共享(在我们实际运用多线程运用技术过程中,所产生或者引发的线程同步、资源共享问题) 互斥锁、自旋锁、... 阅读详情

相关推荐

GCD的高级用法

GCD的一些高级用法,是不容错过的多线程开发学习材料

iOS GCD的基本使用

简而言之,就是 创建任务--创建对列-->把任务放到对列里.同步执行(sync)和异步执行(async)。串行对列,并行对列(注意:并行对列并不是说有多个对列并行,不管串行对列还是并行对列,都只有一个对列,对列里放的任务是串行的,叫串行对列,对列里放的任务是并行的,叫并行对列)所以理论上任务和对列有4种组合方案:1.串行对列里添加同步任务;2.串行对列里添加异步任务;3.并行对列里添加同步任务;

wyz670083956的博客 1831

彩票预测的可能性与算法分析

彩票作为一种以随机数为基础的赌博形式,吸引了大量希望一夜暴富的参与者。尽管许多人希望通过某种方式预测彩票结果,以增加中奖几率,但彩票预测的可能性依然是一个充满争议和误解的话题。本文将探讨彩票是否能够预测的理论依据,分析可能的预测算法,并解释这些算法为何在实际应用中难以奏效。

m0_38012434的博客 2万+

iOS高级程序员进阶——多线程编程核心技术模式篇

多线程是一种软件实现多个线程并发执行任务的技术。在iOS开发中,实现多线程的的方式有很多种,常用的有pthread、NSThread、GCD与NSOperation。在实际应用中,多线程技术也有着非常多的使用场景,比如异步的网络请求、异步的图片加载、后台执行复杂任务等等。在iOS相关技术岗位的面试中,多线程技术更是必考项。作为开发者,我们除了能够熟练使用常用的多线程编程技术外,对于复杂场景的多线程及决方案也要有所了解,例如互相依赖的任务的线程分配,多队列组的应用、死锁场景的分析和优化等。本课程将详细介绍pthread、NSThread、GCD与NSOperation这几种多线程编程接口的应用。并帮助同学们分析多线程编程常出现的风险场景与解决方案。

Kolla 容器化 高可用OpenStack 部署与 Ceph 集群集成

本文介绍了 Kolla 项目在容器化 OpenStack 部署和管理方面的应用,以及与 Ceph 集群的集成。Kolla 项目通过容器技术提供了一种简化和自动化的 OpenStack 部署方法,同时实现了易于升级和回滚的特点。本文还探讨了 Kolla 在实现零宕机升级方面的进展,并分析了其对 OpenStack 用户和社区的重要意义。

we22635的博客 2702

从数据到图片:手把手构建FMCW雷达人体行为识别数据集(行走、跌倒、喝水等6类动作)

本文详细解析了如何利用FMCW雷达构建人体行为识别数据集,涵盖行走、跌倒、喝水等6类动作。通过多普勒特征可视化、图像标准化处理和自动化流水线设计,将原始雷达信号转化为高质量时频图像数据集,为智能家居和健康监护等应用提供可靠数据支持。

weixin_30706691的博客 384

iOS 线程之GCD的高级用法

iOS 线程之GCD的高级用法

︶ ̄嘀調℃ 2655

CTP接口入门

该文章主要讲什么 这篇文章的面向对象是有一些C++基础,并且想用C++来做程式化交易的同学。 这篇文章可以算是我的程式化学习笔记中的一篇。其中介绍了CTP的简单的使用方式,并且附上了一些代码以及我在试用的时候遇到的一些小坑。 什么是CTP CTP是上海期货推出的一套可供程序调用的交易接口。就好比官方给程序化交易提供了的一个专门的业务窗口。 接口相关文件下载 CTP接口可以在上期...

weizehua的专栏 4万+

GCD高级用法-信号量

GCD中的信号量是指 Dispatch Semaphore。 所谓信号,类似于道路上的信号灯,一种用来标识等待还是通过的标志。绿灯通过,红灯等待。道路中通过信号灯的颜色标识通过和等待,而Dispatch Semaphore中通过“计数”来标识通过和等待。 GCD的Dispatch Semaphore提供了三个函数操作Semaphore:   dispatch_semaphor

每天进步一点点 6814

MATLAB代码转到FPGA代码

添加完文件之后,需要设置输入的数据类型,设置完之后点击Workflow Advisor。MATLAB文件包含一个功能实现文件和测试文件。对应FPGA中的功能文件和测试文件。然后,将功能文件和测试文件添加到相应位置。然后选择APP中的HDL Coder代码。首先需要编写好MATLAB文件。点击链接,就可以查看你看到的代码。可以自己生成代码的语言类型。

小柚子的博客 3062

【史上最全面esp32教程】网络篇和tcp/ip的使用

ESP32史上最全面wifi和tcp/ip连接及示例程序

m0_62599305的博客 9521

iOS单例详解

在开发中经常会用到单例设计模式,目的就是为了在程序的整个生命周期内,只会创建一个类的实例对象,而且只要程序不被杀死,该实例对象就不会被释放。下面我们来看看单例的概念、用途、如何创建,以便加深理解。 作用 在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在APP开发中我们可能在任何地方都要使用用户的信息,

lqk的博客 1806

学Simulink——基于Simulink的输入-输出线性化精确转矩控制

本文详细介绍了基于Simulink的永磁同步电机(PMSM)输入-输出线性化(IOL)精确转矩控制方法。针对传统解耦控制在非线性转矩特性下的局限性,提出通过精确反馈线性化实现转矩指令与实际转矩的严格线性关系。文章系统阐述了IOL原理、PMSM控制器推导过程,并提供了完整的Simulink建模步骤,包括电机模型搭建、IOL控制器实现和闭环系统构建。通过仿真对比验证了IOL方法在转矩跟踪精度、动态响应和参数鲁棒性方面的显著优势,最后讨论了工程实现要点和扩展应用方向。该方法为高性能伺服系统开发提供了有效解决方案。

amy_mhd的博客 60

iOS多线程之GCD

多线程编程是iOS 开发中必不可少的部分。这一篇博客主要是讲一讲GCD相关的知识。

LilyNothing的博客 502

YOLOv11的多任务学习:检测+分割+姿态估计-(扩展模型头部分支,实现多任务联合训练)

YOLOv11作为Ultralytics团队于2024年9月发布的最新YOLO系列模型,在前代版本基础上进行了多项架构创新,使其成为支持多任务学习的理想框架。其核心改进包括引入C2PSA(跨阶段局部自注意)模块,将跨阶段局部网络和自注意机制优势结合,使模型能够更有效地跨多层捕获上下文信息。C3k2模块取代了之前的C2f模块,作为CSP Bottleneck的自定义实现,使用两个较小卷积核而非一个大卷积核,在保持准确性的同时提高了效率。 多任务学习(Multi-Task Learning, MTL)在YOL

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 655

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

iOS 多线程 GCD(滚床单) 的高级用法

GCD 的四种高级用法: 以下是我总结的四种 滚床单 的高级用法 及示例程序 和 输出结果. #pragma mark - 1.0 一次性执行 : 代码只执行一次 #pragma mark - 2.0 单设计模式 : 创建单例 #pragma mark - 3.0 延时执行方法 : 延时执行任务 #pragma mark - 4.0 调度

张锦辉的博客 1814

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

单例加锁和不加锁的区别

一,单线程模式单例 // 单线程单例 +(instancetype)sharedLoadData { static Singleton *singleton; if (!singleton ) { singleton = [[Singleton alloc] init]; } return singleton; } 1.单线程单例只有在单个线程使用的情况下使用,在多线程的情况下,会产生线程不安全的情况,严格意义上来说,我们还需要把alloc方法变为私有方法才行,严格的单例是不允

田风有的博客 2477

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

iOS 单例

参考文献 iOS-单例的正确写法 文章目录参考文献介绍单例单例的代码实现不使用GCD的方式使用GCD关于allocWithZone: 介绍单例 单例类,在整个项目中只有一个实例,并提供一个类方法供全局调用,在编译时初始化这个类,然后一直保存在内存中,到程序退出时由系统自动释放这部分内存 一般在程序中,经常调用的类,如工具类、公共跳转类等都会采用单例模式 在程序中,一个单例类在程序中只能初始化一次,为了保证在使用中始终都是存在的,所以单例是在存储器的全局区域,在编译时分配内存,只要程序还在运行就会一直占用内

吃橘子 624

iOS——单例

iOS——单例单例介绍单例的用法单线程模式单例通过@synchronized加锁多线程单例GCD多线程方式实现单例allocWithZone单例的优点与缺点 单例介绍 在 Foundation 和 Application Kit 框架中的一些类只允许创建单个对象, 即这些类在当前进程中的只有唯一一个实例。 举例来说,NSFileManager (faɪl mænɪdʒə)和 NSWorkspace 类 在使用时都是基于进程进行单个对象的实例化。当向这些类请求实例的时候,它们会向您传递单一实例的一个引用,如果

weixin_51638861的博客 406

ios 单例实现方式

在开发中经常会用到单例,它在整个程序的运行周期里面只会被创建一次,只要程序没有结束,它就不会被释放!创建单例的两种方式如下: 一、GCD方式创建单例 static id _instance; + (instancetype)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToke; dispa

CWen丶文 的博客 548

单例GCD创建与图片生成缩略图

单例的创建就是创建出一个方法,在整个工程是唯一的,且只被执行一次,下面就是通过GCD来创建一个单例,代码如下: // 单例的创建 + (id)sharedImage{ static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ instance = [self new];

fenliuheliu的专栏 439

GCD之单例iOS

单例模式 至于什么是单例模式,我也不多说,我只说说一般怎么实现。在 Objective-C 中,实现单例的方法已经很具体了,虽然有别的方法,但是一般都是用一个标准的方法了,下面来看看。 OBJECTIVE-C @interface Tool : NSObject NSCopying> + (instancetype)sharedTool; @end @implementatio

CSND_GO 436

iOS底层探索之多线程(八)—GCD源码分析(函数的同步性、异步性、单例)

回顾 在上篇博客已经对GCD的sync同步函数产生死锁的情况,进行了底层的源码探索分析,那么本篇博客继续源码的探索分析! 1. 全局并发队列+同步函数 dq->dq_width == 1为串行队列,那么并发队列该怎么走呢? 如下图,走的是下面的框框中流程 但是这么多的分支,到底是走的哪一个呢?通过对_dispatch_sync_f_slow、 _dispatch_sync_recurse 、_dispatch_introspection_sync_begin 、_dispatch_sync_invo

俊而不逊的博客 887

GCD同步函数死锁的本质&GCD单例底层探索

疑问点 同步函数与异步函数的区别? 能否开辟线程 任务的回调是否具备异步性/同步性 结合队列(串行/并发)时产生死锁问题 1 概述 经过前篇的探索、其实已经对GCD的底层源码回调的调用流程有了一个系统的理解. 本篇用来补充拓展、带着疑问进行源码探索. 探索的源码采用 **libdispatch-1271.120.2 **版本. 2 函数与队列搭配的特性: 同步函数 dispatch_sync串行队列DISPATCH_QUEUE_SERIAL 不会开启线程,在当前线程执行任务 任务串行执行,

Holothurian 861

基础——单例创建

一、单线程模式单例 +(instancetype)sharedSingleton { static Singleton *singleton; if (!singleton) { singleton = [[Singleton alloc] init]; } return singleton; } 单线程单例只有在单个线程使用的情况下实用,在...

haifangnihao的博客 9366

iOS 三种创建单例的方法

1&gt;. 什么是单例 单例模式是一种常用的软件设计模式。在它的核心结构中包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果系统在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。 2&gt;. 单例用处 应用场景:在程序中类只初始化一次的时候用单例方法,单例类在内存中只创建一次 /...

YuanLiYin079的博客 1801
上一篇: GCD高级用法(二) dispatch_group
下一篇: 多线程与GCD
韩小城
博客等级 码龄12年 37粉丝 22原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值