NSOperation

  1. 配合使用NSOperation和NSOperationQueue也可以实现多线程编程。

  2. 实现多线程的步骤
    先将需要执行的操作封装到一个NSOperation对象中,然后将NSOperation对象添加到NSOperationQueue中,系统会自动将NSOperationQueue中的NSOperation取出来。将取出来的NSOperation封装的操作放到一条新线程中执行。

  3. NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类。
    使用NSOperation子类的方式有3种
    NSInvocationOperation
    NSBlockOperation
    自定义子类继承NSOperation,实现内部相应的方法。
    NSBlockOperation可以开启多个任务,使用addExecutionBlock方法。

  4. NSOperationQueue的队列类型

  • 主队列 [NSOperationQueue maonQueue],凡是添加到主队列中的任务,都会放到主线程中执行。

  • 非主队列,即其他队列
    [[NSOperationQueue alloc]init] ,同时包含了串行和并行功能,添加到这种队列中的任务,就会自动放到子线程中执行。

  • 如果NSInvocationOperation不添加到队列中,而是直接调用的start方法,则是在主线程中执行的。添加到队列中也不用调用start方法。
    自定义NSOperation方法需要重写main方法。

  1. NSOperation可以调用start方法来执行任务,但默认是同步执行的。
    也可以不创建operation对象,直接用addOperationWithBlock来直接添加任务。
    queue.maxConcurrentOperationCount表示设置最大并发操作数。用这个也可以控制创建线程的个数,如果这个数是1就变成了串行队列。大于1则为并行队列。默认是-1,即按照系统默认的线程数创建。

oqueue.suspend为yes表示暂停这个队列,queue里面的任务会被暂停,如果要恢复设置为no即可。isSuspended表示判断是否是挂起状态。
如果一个任务里有耗时的操作,即使暂停也会把这个任务执行完,然后把其他任务取消掉。

[queue cancelAllOperations] 也是这样,只是这个是取消,没办法再继续执行。

  1. 当自定义NSOperation时,如果main方法里有多个任务,最好每个任务执行前小用isCanceled判断是否已经被取消,这样做的目的是为了防止外面已经把任务取消了,但里面还在执行。

  2. NSOperation按照顺序执行,可以用 addDependency 即可。
    当NSOperation的任务执行完后会自动调用completionBlock代码块。故可以在这里监听已执行完。

  3. 线程间通信可以用 [[NSOperationQueue mainQueue]addOperationBlock] ,这样使操作放到主线程中执行。

你可能感兴趣的:(NSOperation)