iOS开发 - 第03篇 - 多线程 - 02 - GCD & 单例 & NSOperation
2016-06-28 20:55
537 查看
1、GCD - 延迟执行
2、GCD - 一次性代码
3、GCD - 队列组
需求:子线程下载两张图片,合并后,放到主线程中显示方法1:开启一个子线程,下载图片1,再下载图片2,再合并后,放到主线程中显示
方法2:队列组(开两个线程分别下载图片1和图片2,完成后合并,再放到主线程中显示)
4、GCD小结
5、单例模式 --- 重要
单例模式的作用:可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问,从而方便的控制了实例的个数,并节约系统资源单例模式的使用场合:在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次)
5.1 基本实现
1> 重写allocWithZone:方法2> 上述方法在多线程中仍可能创建多次(第一次在调用父类allocWithZone:方法中,还没有分配好内存,此时_musicTool为nil,此时另一个线程又进来,就又会调用父类allocWithZone:方法),因此需要加锁
3>添加shared方法
注1:搞一个全局变量(_musicTool),在allocWithZone:方法中拦截内存的分配,并在该方法中加锁,防止多个线程进来内存分配多次,就可以做到外面无论调多少次[[MusicTool
alloc] init],永远只返回一个对象(单例模式)
注2:提供shared方法,方便外面拿到里面的这个单例
注3:继续修改shared方法,保证init也只调用一次
4> copy也可能会产生新对象,要保证copy出来的对象还是单例本身,重写copyWithZone:方法(copy内部会调用该方法),直接返回单例即可
- (id)copyWithZone:(NSZone*)zone {
return _musicTool;
}
5.2 完善单例
1>只需要在第一次创建的时候加一次锁,后面不需要加锁,直接返回即可注:两次判断一次都不可以少!!!
2> static作用 ---重要
1>
修饰全局变量
全局变量的作用域仅限于当前文件内部,不能在其他文件中通过extern引用访问!
2>
修饰局部变量 :
局部变量的生命周期跟全局变量类似
但是不能改变作用域!
能保证局部变量永远只初始化1次,在程序运行过程中,永远只有一份内存!
因此:需要将第一步中的_musicTool全局变量用static修饰,防止这个单例在其他文件中被篡改!!!(static
id _musicTool;)
5.3 懒汉式 & 饿汉式
懒汉式:第一次用到单例对象时,再创建(上述步骤即是懒汉式)饿汉式:一进入程序就创建一个单例对象(了解即可)
注:推荐使用懒汉式
饿汉式步骤:
1> 重写load类方法:当类加载到OC运行时环境中(内存),就会调用一次(一个类只会加载1次),这里不存在多线程问题,因为程序一开始就会将类全部加载进内存,此时线程还没来得及开始!并在该方法中alloc
init单例对象
2>allocWithZone方法此时不需要加锁,因为load方法中已经生成单例,只需判断即可,保证用户在外面alloc init时还是返回单例对象
3>此时在外面不需要包含头文件,不需要使用该类,程序在运行一开始就会创建该单例对象
4> 此时shared方法和copy方法直接返回单例即可,不需要再判断,因为在程序一开始的load方法中已经实例化单例
5.4 小结单例写法
5.5 使用GCD实现单例模式
5.6 使用宏实现单例
由于上述实现单例模式的几个方法都一样,可以将其写成宏的形式5.7 MRC下实现单例模式
增加四个方法5.8 适配ARC和MRC
修改宏即可,以后可以直接用宏来来实现单例,不管是ARC还是MRC
6、NSOperation --- 重要
6.1 基本概念
6.2 NSInvocationOperation --- 了解即可
6.3 NSBlockOperation
注:若任务数量为1,直接调用start,还是在当前线程中同步执行
6.4 NSOperationQueue队列基本使用
1>封装操作,创建队列,添加操作到队列2> 创建队列,直接添加操作
6.5 最大并发数
设置最大并发(最多同时并发执行3个任务)queue.maxConcurrentOperationCount= 3;
6.6 操作依赖
6.7 线程间通信
6.8 队列取消、暂停、恢复使用场合
6.9 小结
相关文章推荐
- 下拉选择菜单封装
- iOS 如何关联xib和控制器
- iOS开发之Architectures设置
- iOS中 如何将自己的框架更新到cocopods上 韩俊强的博客
- iOS中 如何将自己的框架更新到cocopods上 韩俊强的博客
- 深入理解 KVC\KVO 实现机制 — KVC
- iOS开发 - 第03篇 - 多线程 - 01 - 多线程基础
- 解决Firemonkey TWebBrowser在IOS9中不工作的问题
- iOS中runtime(运行时)的简单介绍与应用
- iOS设计模式(四) 单例模式
- iOS 角度与弧度的转换
- 【问题】Unable to determine memory usage
- iOS Xcode项目在SVN更新后无法打开解决办法
- ios 常用公共方法
- iOS基本理解
- iOS开发:环信集成步骤以及常见错误
- iOS开发中常用字符串验证处理操作
- iOS中self.xxx 和 _xxx 下划线的区别
- iOS 使用AFN 进行单图和多图上传 摄像头/相册获取图片,压缩图片
- iOS 键盘处理