您的位置:首页 > 移动开发 > IOS开发

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 小结







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: