iOS开发多线程在实际项目中的运用
实际项目开发中为了能够给用户更好的体验,有些延时操作我们都会放在子线程中进行。
今天我们就来聊聊多线程在实际项目中的运用。
我们先来看看多线程的基础知识:
1.多线程的原理:
同一时间,CPU只能处理一条线程,也就是只有一条线程在工作。所谓多线程并发(同时)执行,
其实是CPU快速的在多线程之间调度(切换)。如果CPU调度线程的时间足够快,就造成了多线程并
发执行的假象。
2.在实际项目开发中并不是线程越多越好,如果开了大量的线程,会消耗大量的CPU资源,CPU会
被累死,所以一般手机只开1~3个线程为宜,不超过5个。
3.多线程的优缺点:
优点:1.能适当提高程序的执行效率
2.能适当提高资源的利用率,这个利用率表现在(CPU,内存的利用率)
缺点:1.开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,
子线程占用512KB,如果开启大量的线程,会占用大量的内存空间,降低程序
的性能)
2.线程越多,CPU在调度线程上的开销就越大
3.程序设计就越复杂:比如线程之间的通信,多线程的数据共享,这些
都需要程序的处理,增加了程序的复杂度。
4.在iOS开发中使用线程的注意事项:
1.别将比较耗时的操作放在主线程中
2.耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种“卡”的坏体验
好了,多线程在iOS中的开发概念性的东西就讲这么多,下面我们来模拟一种开发中的场景:
我们在开发中经常会遇到,当你要缓存一组图片,但是这些图片必须要等到你缓冲好了后再来展现在UI上,
可是我们缓存图片的时候用的是SDWebImage框架,缓存的操作是异步进行的,我们如何来做到等缓存好了
再来执行以后的操作呢?下面讲个实现起来非常简单,方便的方法:
我先来放上代码,后面进行讲解:
- //1.添加一个组
- let group = dispatch_group_create()
- //缓存图片
- for url in picURLs! {
- //2.将当前的下载操作添加到组中
- dispatch_group_enter(group)
- SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions.init(rawValue: 0), progress: nil, completed: { (_, _, _, _, _) in
- //3.离开当前组
- dispatch_group_leave(group)
- print("正在缓存中...")
- })
- }
- //通过闭包将数据传递给调用者(通知图片缓存完毕)
- dispatch_group_notify(group, dispatch_get_main_queue()) {
- print("缓存完毕!")
- finished()
- }
从输出结果我们就可以看出来:我们做到了缓存完毕后再来执行以后的操作。
是如何做到的呢?
我在代码中已经用数字标出来了:
1.我们首先用
- let group = dispatch_group_create()
函数来创建一个组,用来存放缓冲的操作
2.用这个函数做到把每一次的缓冲操作都添加到组中
- dispatch_group_enter(group)
3.缓存图片我用的是SDWebImage框架,我们可以看到,我在缓冲完毕后离开当前组,用到如下函数
- dispatch_group_leave(group)
用了这三步就能做到我们想要的功能吗?显然不是,做了这三部系统内部就会为我们做些事了,
当我们离开当前组的时候,系统就会发出一个通知,我们来接收这个通知,当我们接收到这个通知的时候
我们就可以执行finished的操作了,接收通知的函数是:
- dispatch_group_notify(group, dispatch_get_main_queue()) {
- print("缓存完毕!")
- finished()
- }
以上就是一个非常方便的实现我们需要的功能的方法
https://blog.csdn.net/qq_24904667/article/details/52679473
iOS开发多线程在实际项目中的运用的更多相关文章
- iOS开发小技巧--微博项目中的键盘工具条
微博项目中的键盘工具条 项目中的键盘工具条不能使用inputAccessoryView,因为inputAccessoryView不能实现键盘隐藏的时候,工具条还显示在眼前,如图: 所以,果断决定将工具 ...
- 【iOS开发】在ARC项目中使用非ARC文件
ARC的出现应该说是开发者的一大福利,苹果是推荐使用的,但是因为之前没有ARC机制,好多比较好的类库都是使用的非ARC,或是有些大牛还是不喜欢用ARC,封装的类也是非ARC的,想要在自己的ARC项目中 ...
- iOS开发小技巧--初始化项目中修改APP安装后的名称
- iOS开发多线程篇—自定义NSOperation
iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...
- iOS开发多线程篇 11 —自定义NSOperation
iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...
- iOS开发多线程篇—多线程简单介绍
iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...
- iOS 开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- iOS开发多线程篇—创建线程
iOS开发多线程篇—创建线程 一.创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建.启动线程 (1) NSThread *thread = [[NSThread alloc] in ...
- iOS开发多线程篇—线程间的通信
iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任 ...
随机推荐
- 解决IOS端微信浏览器input,textarea有内上边框阴影
box-shadow:0px 0px 0px rgba(0,0,0,0); -webkit-appearance:none;
- scrapy 基础组件专题(九):scrapy-redis 源码分析
下面我们来看看,scrapy-redis的每一个源代码文件都实现了什么功能,最后如何实现分布式的爬虫系统: connection.py 连接得配置文件 defaults.py 默认得配置文件 dupe ...
- python面向对象07/异常处理
python面向对象07/异常处理 目录 python面向对象07/异常处理 1. 异常错误分类 2. 什么是异常? 3. 异常处理 4. 为什么要有异常处理 5. 异常处理的两种方式 1.if判断 ...
- mysql中DDL库和表的管理
#DDL /* 数据定义语言 库和表的管理 一.库的管理 创建.修改.删除 二.表的管理 创建.修改.删除 创建:create 修改:alter 删除:drop */ #一.库的管理 #1.库的创建 ...
- JavaScript 对象的创建和操作
<script> // 对象是属性的无序集合,每个属性都是一个名/值对. 属性名称是一个字符串. // 对象种类 // 内置对象(nativ ...
- Python基础最难知识点:正则表达式(使用步骤)
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 正则表达式,简称regex,是文本模式的描述方法.你可以在google上搜 ...
- [译]使用DOT语言和GraphvizOnline来可视化你的ASP.NETCore3.0终结点01
这是系列文章中的第一篇:使用GraphvizOnline可视化ASP.NETCore3.0终结点.. 第1部分-使用DOT语言来可视化你的ASP.NETCore3.0终结点(本文) 第2部分-向ASP ...
- P1536 村村通(洛谷)并查集
隔壁的dgdger带我看了看老师的LCA教程,我因为学习数学太累了(就是懒),去水了一下,感觉很简单的样子,于是我也来写(水)个博客吧. 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列 ...
- Docker 入门教程(1)——安装
docker大名听说了很久,一直没有去研究过,但现在面试动不动要求docker,还是研究下吧.由于我的电脑是win10系统(穷,买不起mac),安装过程各种坑爹问题不断,一度都想放弃,所以说垃圾win ...
- jq转盘抽奖
之前项目的时候要写一个抽奖,自己写了以后就记录一下. 先是html <div class="turntable_zhan"> <img class="y ...