iOS开发 - 第03篇 - 多线程 - 02 - GCD & 单例 & NSOperation

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










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值