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

TSMaster如何用珠海创芯CAN卡实现高效CAN通信(附完整驱动安装指南)

本文详细介绍了如何使用TSMaster软件与珠海创芯CAN卡实现高效CAN通信,包括驱动安装、系统配置、ControlCAN.dll替换及TSMaster集成配置等关键步骤。通过实战指南和故障排除技巧,帮助工程师快速搭建稳定可靠的CAN通信测试环境,适用于汽车电子和工业控制等领域。

weixin_29201859的博客 479

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

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

ai获客系统功能代码

AI 获客系统是一个复杂的体系,以下为你提供一个简化的 Python 示例,聚焦于客户行为分析与销售线索筛选功能,模拟实现从多渠道收集数据后的初步处理流程。假设已有从官网、线上商城等渠道收集到的客户数据,以字典列表形式存储,每个字典包含客户基本信息及购买行为数据。通过分析客户购买频率与金额,筛选出高价值销售线索。python上述代码仅为基础示例,实际 AI 获客系统还涉及更复杂的数据采集、清洗、存储,以及运用机器学习算法进行深度客户洞察等功能。

weixin_ggwwsscc的博客 892

RocketMQ5.3.0-control-多 Master 多 Salve-异步复制-集群搭建

RocketMQ5.3.0-control-多 Master 多 Salve-异步复制-集群搭建(详细文档)

m0_52369979的博客 730

iOS 线程之GCD的高级用法

iOS 线程之GCD的高级用法

︶ ̄嘀調℃ 2655

保姆级教程:在Ubuntu 22.04上用Conda搞定nuPlan数据集环境(Python 3.9 + PyTorch)

本文提供了一份详细的Ubuntu 22.04环境下使用Conda配置nuPlan自动驾驶数据集的保姆级教程,涵盖Python 3.9安装、Conda环境管理、PyTorch配置及数据集可视化验证等关键步骤,帮助开发者高效搭建开发环境。

weixin_29061997的博客 254

GCD高级用法-信号量

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

每天进步一点点 6814

原神真端,原神服务端,虚拟机启动部署傻瓜式教学

没玩过抽卡 游戏想体验一下抽卡的感觉,听说原神有真端了,所以弄一个局域网的服务体验一下,这里要感谢一些服务端的分享者。

azyouyouyou的博客 1万+

迟滞比较器原理及计算

为什么要用迟滞比较器 在讲迟滞比较器之前,我们先看一个案例。 在产品设计中常常需要用到电机,而电机在从运转到停止过程中需要泄放能量,这种能量大部分以电压的形式反馈回电源母线(Vbus)导致Vbus母线电压升高,特别是功率大又转速快的电机需要急刹时,产生的反馈电压更高,严重时可能导致母线上其他器件的损坏。 为了防止将电机反馈的能量泄放掉,我们需要设计一个电路来检测母线电压,当母线电压高于某一安全阈值时,打开MOSFET Q1将母线上的能量通过电阻R5以热的形式消耗掉。 假如用一般的比较器,设计如下: Vbu

sinat_15677011的博客 2万+

iOS单例详解

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

lqk的博客 1806

S7-200 SMART PLC 数字量阀门控制功能块(FB)汇总

S7-200 SMART PLC功能块的各种写法可以查看专栏的其它文章,链接地址如下:S7-200 SMART PLC 子程序功能块(阀门控制)_RXXW_Dor的博客-优快云博客_plc控制阀门开关程序由于S7-200 SMARTPLC的子程序种种功能、容量限制,有时想实现多次调用的子程序可能并不是太容易,这篇博客还是给出一些推荐写法,供大家参看。

RXXW_Dor的博客 3999

iOS多线程之GCD

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

LilyNothing的博客 502

解决Windows 11文件右键菜单卡死问题的方法

当你右键点击一个文件或者文件夹时,系统会加载与该文件类型相关的上下文菜单项,如果其中某个菜单项的代码执行时间过长或者出现错误,就会导致整个右键菜单卡死。综上所述,当你在Windows 11中遇到右键菜单卡死的问题时,你可以尝试禁用上下文菜单项、重置文件关联、排除第三方软件干扰、修复系统文件以及优化代码等方法来解决问题。如果你是一个开发者,并且你自己编写了一个上下文菜单项,那么问题可能出在你的代码中。例如,如果你遇到了图片文件的右键菜单卡死问题,你可以找到".jpg"或".png"等相关的子项。

HnrzLinux的博客 7536

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

张锦辉的博客 1814

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

单例加锁和不加锁的区别

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

田风有的博客 2477

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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、付费专栏及课程。

余额充值