29-NSOperation queue(操作队列)?

存放NSOperation的集合类

操作和操作队列,基本可以看成java中的线程和线程池的概念。用于处理ios多线程开发的问题。

网上部分资料提到一点是,虽然是queue,但是却并不是带有队列的概念,放入的操作并非是按照严格的先进现出。

这边又有个疑点是,对于队列来说,先进先出的概念是Afunc添加进队列,Bfunc紧跟着也进入队列,Afunc先执行这个是必然的,

但是Bfunc是等Afunc完全操作完以后,B才开始启动并且执行,因此队列的概念离乱上有点违背了多线程处理这个概念。

但是转念一想其实可以参考银行的取票和叫号系统。

因此对于A比B先排队取票但是B率先执行完操作,我们亦然可以感性认为这还是一个队列。

但是后来看到一票关于这操作队列话题的文章,其中有一句提到

“因为两个操作提交的时间间隔很近,线程池中的线程,谁先启动是不定的。”

瞬间觉得这个queue名字有点忽悠人了,还不如pool~

综合一点,我们知道他可以比较大的用处在于可以帮组多线程编程就好了

-----------------------------------------------------

一个operation就相当于一个函数块、block块、代码块,这里只是把它提高到一种任务的角度来看待,然后,任务便会有开始执行(start)、取消(cancel)、是否取消(isCancel)、是否完成(isFinishing)、暂停(pause)等状态函数,其本身是不会创建新的线程来执行它的,NSOperation本身是一个基类,不能直接使用,必须继承它。

NSOperation中比较重要的是start和main函数,一般结合NSOperationQueue来使用,OperationQueue实质上也就是数组管理,对添加进去的operation进行管理、创建线程等;添加到queue里的operation,queue默认会调用operation的start函数来执行任务,而start函数默认又是调用main函数的。

如果不想自定义operation,则可以简单使用系统预定义的两个operation子类:NSBlockOperation(任务块是一个block块)、NSInvocationOperation(任务块是一个函数块)

另外,OperationQueue在使用上也有很大的缺陷,比如一旦operation添加到队列中后,就不能再对operation进行一些修改操作,否则将会出现不可预知的错误,因为operation在队列中有可能随时都会被执行;只能进行cancel或整个队列的cancelAllOperations操作,对单个operation进行cancel后,这个operation还会短暂停留在队列的operations数组里,要稍等片刻才会被移除,这样对于外界使用队列这个operation数组的情况将会出现bug,cancelAllOperations也是要等会才会全部被移除;值得一提的是,cancel和cancelAllOperations默认情况下,都不能取消已经正在执行的operation,只能取消在队列中等待的operation,如果硬要取消正在执行的,只能重写operation的main方法,并在main方法中添加对isCancel属性的监控;而且对于队列的setSuspended方法也只是暂停等待的operation,还有operation添加依赖、队列最大线程数等,功能都比较鸡肋,一切队列的方法都只能对等待的operation才能起作用。

如此一来,特别对于像下载这样的,只能自定义operation对象,并重写start方法(start方法中,不一定仍然调用自身的main方法,可以自己指定执行的方法,像AFURLConnectionOperation一样)、自己创建线程;之前的operation本身是不会创建线程的,线程是在queue中创建,所以才产生并发的效果

你可能感兴趣的:(29-NSOperation queue(操作队列)?)