美文网首页
NSOperation

NSOperation

作者: 飘摇的水草 | 来源:发表于2022-09-02 20:10 被阅读0次
    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

          本文链接:https://www.haomeiwen.com/subject/eksynrtx.html