OperationQueue

2018/8/11 posted in  iOS

maxConcurrentOperationCount

import Foundation

let opqueue = OperationQueue()
opqueue.maxConcurrentOperationCount = 1
opqueue.addOperation({print("厉") ;sleep(3)})
opqueue.addOperation({print("害") ;sleep(3)})
opqueue.addOperation({print("了") ;sleep(3)})
opqueue.addOperation({print("我") ;sleep(3)})
opqueue.addOperation({print("的") ;sleep(3)})
opqueue.addOperation({print("国") ;sleep(3)})
opqueue.waitUntilAllOperationsAreFinished()

因为maxConcurrentOperationCount 的值为1,意味着最大的并发数为1,每个操作sleep 3s,一共6个操作,所以总耗时为 3*6 = 18s

设置最大并发操作数量,maxConcurrentOperationCount =1表示串行队列,>1代表并发队列

如果不设置opqueue.maxConcurrentOperationCount = 1就使用系统的默认配置。

如果设置opqueue.maxConcurrentOperationCount = 2则2个操作一起执行,一共3次,所以总耗时为 3*3 = 9s

waitUntilAllOperationsAreFinished

func waitUntilAllOperationsAreFinished()
阻止当前线程,直到所有接收器的排队和执行操作完成执行。
调用时,此方法会阻塞当前线程并等待接收方的当前和排队操作完成执行。当前线程被阻塞时,接收器继续启动已经排队的操作并监视正在执行的操作。在此期间,当前线程无法向队列添加操作,但其他线程可能。完成所有挂起操作后,此方法返回。

如果队列中没有操作,则此方法立即返回。
  • opqueue.waitUntilAllOperationsAreFinished()

    let opqueue = OperationQueue()
    print(Date())
    opqueue.maxConcurrentOperationCount = 1
    opqueue.addOperation({print("厉") ;sleep(3)})
    opqueue.addOperation({print("害") ;sleep(3)})
    opqueue.addOperation({print("了") ;sleep(3)})
    opqueue.addOperation({print("我") ;sleep(3)})
    opqueue.addOperation({print("的") ;sleep(3)})
    opqueue.addOperation({print("国") ;sleep(3)})
    opqueue.waitUntilAllOperationsAreFinished()
    print(Date())
    //打印结果
    2019-04-30 05:03:12 +0000






    2019-04-30 05:03:30 +0000
    //opqueue.waitUntilAllOperationsAreFinished()
    //打印结果
    2019-04-30 05:06:45 +0000

    2019-04-30 05:06:45 +0000




    说明设置了opqueue.waitUntilAllOperationsAreFinished()会阻碍当前线程,阻碍之后的打印日期操作。