iOS开发多线程在实际项目中的运用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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()
}
以上就是⼀个⾮常⽅便的实现我们需要的功能的⽅法。