您的位置:首页 > 运维架构

多线程 GCD和NSOperation

2016-09-08 10:14 120 查看

1.认识多线程 GCD和NSOperation

1.1谈一谈GCD和NSOperation的区别

首先二者都是多线程相关的概念,当然在使用中也是根据不同情境进行不同的选择;

GCD是将任务添加到队列中(串行/并发/主队列),并且制定任务执行的函数(同步/异步),其性能最好,底层是C语言的API,也更轻量级.iOS4.0以后推出的,针对多核处理器的并发技术,只能设置某一个队列的优先级,其高级功能有一次性执行的dispatch_once,延迟操作dispatch_after,调度组等;

NSOperation把操作(异步)添加到队列中(全局的并发队列),是OC框架,更加面向对象,是对GCD的封装,iOS2.0推出GCD之后,对NSOperation的底层全部重写,可以随时取消已经设定准备要执行的任务,已经执行的除外,可以设置队列中每一个操作的优先级,其高级功能可以设置最大操作并发数,继续/暂停/全部 取消,可以给对垒设置操作的以来关系.

1.2谈谈多线程的应用

通常耗时的操作都放在子线程处理,然后主线程更新UI ,如

我们要从数据库提取数据还是要将数据分组后显示,纳闷就会开个子线程来处理,处理完成后才去刷新UI显示.

拍照后,会在子线程处理图片,完成后才回到主线程来显示图片.拍照出来的图片太大了,因此要做处理.

音频,视频处理会放在子线程来操作

文件较大时,文件操作会在子线程中处理

做客户端与服务端数据同步时,会在后台闲时自动同步

2.线程之间是如何通信的

通过主线程和子线程切换的时候传递参数performSelecter:onThread:withObject:waitUntilDone:

3.网络图片处理问题怎么解决图片重复下载问题?(SDWebImage大概实现原理)

这个就需要用到字典,以图片下载地址url为key,下载操作作为value,所有的图片大概分成三类:已经下载好的,正在下载的,和将要下载的;

当一张图片将要进行下载操作的时候,先判断缓存中是否相同的图片,如果有的话返回这个图片,没有的话就根据url的md5值去沙盒中找,有的话就拿出来用,没有的话再去以图片的url为key去字典中找有没有正在进行的任务,左后去判断等待下载的操作任务里面的字典有没有相同的key,如果没有,就开启任务,记录一下,文件保存的名称是url的md5值

这里建立了两个字典:

1.iconCache:保存缓存的图片

2.blockOperation用来保存下载任务

每当进入或退出程序时,会进行图片文件的管理:超过一星期的文件就会别清除,如果设置了最大缓存,查过这个缓存就会删除最旧的文件,知道当前缓存文件为最大缓存文件的一半大小;

一般app中大部分缓存都是图片的情况下,可以直接调用clear方法进行清除缓存,getSize方法获取当前缓存大小.

4.多线程安全的几种解决方法

1.只有在主线程刷新访问UI

2.如果要防止资源抢夺,要使用sunchronize进行加锁保护

3.如果是异步操作要保证线程安全等问题,尽量使用GCD(有些函数默认就是安全的)

4.单例为什么用static dispatch_once?

使用dispatch_once可以简化代码并彻底保证线程安全,开发者无需担心加锁或同步.此外,dispatch_once更高效,它没有使用重量级的同步机制,若是那样做的话,每次运行代码前都要获取锁.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程