一、NSOperation是一种多线程的方式。首先,我们要先明白NSOperation是一个抽象类,不能直接使用它,它是基于GCD的封装,提供了GCD一些不具有的方法如(方法的依赖,方便我们控制执行操作的顺序)我们可以使用它的两个子类NSInvocationOperation和NSBlockOperation或者使用自定义的方法创建一个继承与NSOperation的类。这种抽象类本人理解为是对代码的封装(将它们公用的方法和属性抽取出来),再根据一些不同的功能创建两个子类。
二、子类NSBlockOpertaiton的使用:
如果要让它开启新的线程,我们可以添加大于1的操作数,如下:
或者将操作加入到队列也可以开启新的线程:
三、NSInvocationOperation的使用:
一般情况下我们使用NSOperation是不会用start这种方法的,因为,它默认开启的是同步的模式,只有将NSOperation和NSOperationQueue结合才能体现这种多线程的最大优势。那么如何使用NSOperationQueue呢?
NSOpertaionQueue的使用:(当我们将操作添加到队列中,它会自动调用start方法)
(1)[NSOperationQueue mainQueue];可以直接使用主队列的方法,注意运行在主队列的操作,其实都是在主线程中
(2)[[NSOperationQueue alloc]init];创建一个队列,这种非主队列的队列,具有串行和并行的特点,放入其中的操作会在子线程中执行。
(3)设置NSOperationQueue的最大并发数,NSOperationQueue可以通过以下方法设置最大并发数,
setMaxConcurrentOperationCount:,值得注意的是:当并发数为1就变成了串行执行任务
(4)NSOperationQueue的暂停恢复和取消:
NSOperation有一个cancel方法可以取消单个操作
取消
NSOperationQueue的cancelAllOperations相当于队列中的每个operation调用了cancel方法,会取消队列里面全部的操作。但是,不能取消正在进行中的任务,队列调用了cancelAllOperations后会等当前正在进行的任务执行完闭后取消后面的操作
挂起和恢复
isSuspended: 判断是否挂起
setSuspended: YES表示挂起,NO表示恢复
和取消功能类似,我们同样不能挂起正在运行中的操作,队列会等当前操作结束后将后面的操作暂停(挂起)。因此, 我们在自定义NSOperation的时候需要注意,最好可以经常通过判断isCancelled方法检测操作是否被取消,以响应外部可能进行的取消操作