美文网首页iOS
Swift- 多线程编程 Operation

Swift- 多线程编程 Operation

作者: lxl125z | 来源:发表于2017-03-09 22:26 被阅读900次

    相关文章:NSOperation

    项目Demo代码

    一、NSOperation子类

    NSOperation是一个抽象类,并不具备封装操作的能力,必须使用它的子类

    1、NSInvocationOperation(Swift不支持)

    默认是不会开启线程的,只会在当前的线程中执行操作,可以通过Operation和OperationQueue实现多线程

    2、BlockOperation:

    只要BlockOperation封装的操作数 > 1,就会异步执行操作,但是不会无限制的创建线程

     let blockOpe = BlockOperation()
      blockOpe.queuePriority = .veryHigh
      blockOpe.addExecutionBlock {
      print("BlockOperation执行了",Thread.current)
            }
      blockOpe.addExecutionBlock {
      print("BlockOperation2执行了",Thread.current)
        }
      blockOpe.start()  //开始执行
      //blockOpe.cancel() //取消
    

    二、NSOperationQueue

    1、创建队列

    获取主队列以及添加操作到队列,主队列是串行队列,无论是否设置最大并行数量都是在当前线程执行,不会创建新的线程

     let queue = OperationQueue.main
     queue.addOperation {}
    
    

    同时具备串行和并发的功能,默认情况下是并发的,可以手动设置为串行队列,通过设置最大并发数属性来更改

     let queue = OperationQueue()
     queue.maxConcurrentOperationCount = 1
      queue.addOperation {
        for _ in 0...50000{
           print("OperationQueue1执行了",Thread.current)
            }
       }
       //addOperation已经在内部执行了start方法了
    

    2、最大并发数

    1、取消队列中的所有任务,除了正在执行的任务,一旦被取消,就不能回复之前的操作。

    2、将最大操作数的值设置为1,可以实现任务的串行效果,但是要注意的是,并不是只开一条子线程(通常会开两条子线程,循环回收复用)

    3、最大并发数6以内,不要开太多,因为虽然任务是在子线程进行处理的,但是cpu处理这些过多的子线程可能会影响UI,让UI卡顿。

    queue.maxConcurrentOperationCount=2;
    
    

    3、队列的取消

    当前正在处于执行状态的任务是不能够取消的,只能取消等待的任务

    queue.cancelAllOperations()
    

    4、队列的挂起和恢复

    当前正在处于执行状态的任务是不能够暂停的,只能暂停等待的任务

    queue.isSuspended = true    //暂停队列
    queue.isSuspended = false  //恢复队列
    

    5、等待Options完成

    如果需要在当前线程中处理operation完成后的结果,可以使用NSOperation的waitUntilFinished方法阻塞当前线程,等待operation完成

    // 会阻塞当前线程,等到某个operation执行完毕  
    [operation waitUntilFinished];
    
    

    使用NSOperationQueue的waitUntilAllOperationsAreFinished方法

    // 阻塞当前线程,等待queue的所有操作执行完毕  
    [queue waitUntilAllOperationsAreFinished];
    
    

    6、添加NSOperation的依赖对象

    当某个NSOperation对象依赖于其它NSOperation对象的完成时,就可以通过addDependency方法添加一个或者多个依赖的对象,只有所有依赖的对象都已经完成操作,当前NSOperation对象才会开始执行操作。另外,通过removeDependency方法来删除依赖对象。

    //设置依赖关系
    let blockOpe1 = BlockOperation()
    blockOpe1.addExecutionBlock {
    print("blockOpe1执行了")
    }
    let blockOpe2 = BlockOperation()
     blockOpe2.addExecutionBlock {
    print("blockOpe2执行了")
    }
    blockOpe1.addDependency(blockOpe2)
    queue.addOperation(blockOpe1)
    queue.addOperation(blockOpe2)
    可以看出,先执行blockOpe2,再执行blockOpe1
    

    7、修改Operations的执行顺序

    默认所有operation都拥有“普通”优先级,不过可以通过setQueuePriority:方法来提升或降低operation对象的优先级。

     let blockOpe = BlockOperation()
      blockOpe.queuePriority = .low
      queue.addOperation(blockOpe)  
    

    相关文章

      网友评论

      • jgj1218:写的真详细,让我对线程又多了一分理解!

      本文标题:Swift- 多线程编程 Operation

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