-
配合使用NSOperation和NSOperationQueue也可以实现多线程编程。
-
实现多线程的步骤
先将需要执行的操作封装到一个NSOperation对象中,然后将NSOperation对象添加到NSOperationQueue中,系统会自动将NSOperationQueue中的NSOperation取出来。将取出来的NSOperation封装的操作放到一条新线程中执行。 -
NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类。
使用NSOperation子类的方式有3种
NSInvocationOperation
NSBlockOperation
自定义子类继承NSOperation,实现内部相应的方法。
NSBlockOperation可以开启多个任务,使用addExecutionBlock方法。 -
NSOperationQueue的队列类型
-
主队列
[NSOperationQueue maonQueue]
,凡是添加到主队列中的任务,都会放到主线程中执行。 -
非主队列,即其他队列
[[NSOperationQueue alloc]init]
,同时包含了串行和并行功能,添加到这种队列中的任务,就会自动放到子线程中执行。 -
如果NSInvocationOperation不添加到队列中,而是直接调用的start方法,则是在主线程中执行的。添加到队列中也不用调用start方法。
自定义NSOperation方法需要重写main方法。
- NSOperation可以调用start方法来执行任务,但默认是同步执行的。
也可以不创建operation对象,直接用addOperationWithBlock来直接添加任务。
queue.maxConcurrentOperationCount表示设置最大并发操作数。用这个也可以控制创建线程的个数,如果这个数是1就变成了串行队列。大于1则为并行队列。默认是-1,即按照系统默认的线程数创建。
oqueue.suspend为yes表示暂停这个队列,queue里面的任务会被暂停,如果要恢复设置为no即可。isSuspended表示判断是否是挂起状态。
如果一个任务里有耗时的操作,即使暂停也会把这个任务执行完,然后把其他任务取消掉。
[queue cancelAllOperations]
也是这样,只是这个是取消,没办法再继续执行。
-
当自定义NSOperation时,如果main方法里有多个任务,最好每个任务执行前小用isCanceled判断是否已经被取消,这样做的目的是为了防止外面已经把任务取消了,但里面还在执行。
-
NSOperation按照顺序执行,可以用
addDependency
即可。
当NSOperation的任务执行完后会自动调用completionBlock代码块。故可以在这里监听已执行完。 -
线程间通信可以用
[[NSOperationQueue mainQueue]addOperationBlock]
,这样使操作放到主线程中执行。
网友评论