操作和操作队列
NSOperation和NSOperationQueue
1、简单介绍
NSThread 多任务处理时 手动操作很不方便
作用:NSOperation和NSOperationQueue配合使用实现多线程编程 Threading Programming
NSOperation
它是一个抽象类,它本身不具有处理操作的能力。它的使用方法是必须使用NSOperation的子类。使用NSOperation的最简单的方式就是把一个NSOperation对象加入到NSOperationQueue队列中,一旦这个对象被加入到队列,队列就开始处理这个对象的任务,直到这个对象的所有操作完成,然后它被队列释放。
2、NSOperation是一个抽象类,并不具备封装操作任务的能力,必须使用它的子类
NSOperation有3种:
1)NSInvocationOperation 字面意思来看就是调用操作
注:操作对象默认在主线程中执行,只有添加到队列中才会开启新的线程。
2)NSBlockOperation,与NSInvocationOperation一样同属NSOperation的具体子类,但不同的是以block的形式对程序进行封装,但block本身没有提供显示的传入参数和返回结果。
注:NSBlockOperation封装的操作数大于1,就会异步执行操作
3)自定义子类继承NSOperation,实现相应的方法main方法 来处理任务(实现主要任务的方法)
operation的开始和取消
NSOperationQueue的使用
设置队列的最大并发数 即队列中最多同时运行几个任务
queue的暂停和继续
取消当前queue中的所有操作
queue中的operation的执行顺序
queue中的operation的优先级
决定Queue中的operation的执行顺序的因素:
1、依赖关系
2、优先级(只针对于已经准备好的operation)
ASIHTTPRequest继承于NSOperation
有4个术语比较容易混淆:同步、异步、并发、串行
1,同步和异步决定了要不要开启新的线程
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新的线程中执行任务,具备开启新线程的能力
2,并发和串行决定了任务的执行方式
并发:多个任务并发(同时)执行
串行:一个任务执行完毕后,再执行下一个任务
NSThread在处理多线程时 需要手动操作,不方便;
NSOperation 和 NSOperationQueue配合使用,完成多线程操作,操作简单,效率比较高
NSOperation 看起来是处理操作的一个类,定义并提供了子类所需的关键方法和基础架构。 但是本身是一个抽象类 不具备处理操作的能力。需要继承并实现NSOperation类的子类,来处理自己的程序工作单元。为了减少应用程序的类的数量和复杂性,Foundation框架提供了两个NSOperation的具体子类以供使用:
前两种 子类方法
1,NSInvocationOperation 他是负责调用操作的一个类
2,NSBlockOperation。与NSInvocationOperation一样同属NSOperation的具体子类,但不同的是以block的形式对程序进行封装,但block本身没有提供显示的传入参数和返回结果。
向NSBlockOperation中添加任务,当他操作的任务数量大于1的时候,会在不同的分线程中 并发 执行(也就是在不同的分线程中执行)
在创建blockOperation后可以调用addExecutionBlock:方法添加更多的block
3,另外一种NSOperation的方式
自定义子类继承NSOperation,实现相应的方法main方法 来处理任务(实现主要任务的方法)
对于自定义子类的方式,可以分为 并发 和 非并发两种形式,定义非并发的NSOperation要简单许多,只需要重载-(void)main这个方法,在这个方法里面执行主任务,并正确地响应取消事件;定义并发的NSOperation则复杂很多,需要重写NSOperation的几个方法。
4,NSOperationQueue.
NSOperationQueue的作⽤:NSOperation可以调⽤start⽅法来执⾏任务,但默认是同步执行的
如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作
添加操作到NSOperationQueue中,自动执行操作,自动开启线程
让队列中的操作按顺序输出
决定队列中的操作的操作顺序的决定因素有两个:
主要因素:操作之间的依赖关系。也就是让两个操作相互依赖。[A addDependency:B] 先执行B
次要因素:操作的优先级,(只针对已经准备好的操作)
但是,要注意的是 如果只是设置两个操作之间的依赖关系和优先级,则只会控制两个操作之间的操作顺序,跟其他的操作无关,两个操作也不一定挨着一先一后输出