이 글은 Xcode 8베타를 기반으로 작성했습니다. 안맞는 부분은 알아서 채우십시오.

NSOperationQueue의 마지막 임종의 순간을 알아내는 일은 언제나 개발자들에게 큰 숙제 였습니다. 물론 실력있는 개발자들은 알아서 여러가지 방식으로 큐의 마지막 신호를 체크해 사용하고 있을겁니다.

저 같은 경우 operationCount 프로퍼티를 옵저빙하여 쓰고 있는데, 여기 훌륭한 글을 발견해서 영감을 받아 짧게 코드를 올려봅니다.

출처 -> Code at the end of the queue by marcin krzyzanowski

사실 원 글의 소스와 비교해 사소한 차이만 있습니다. 어떻게 보면 더 떨어질 수도 있어요.

[code language=“java” gutter=“false”]

extension Array where Element: Operation {

func addFinishOperation(finishHandle: ()-> Void) -> Operation {

let finishOperation = BlockOperation(block: finishHandle)

forEach {

  if $0.isReady {

    finishOperation.addDependency($0)

  }

}

return finishOperation

}

}

extension OperationQueue {

func addFinishOperation(finishHandle: () -> Void) {

addOperation(self.operations.addFinishOperation(finishHandle: finishHandle))

}

}

let queue = OperationQueue()

queue.maxConcurrentOperationCount = OperationQueue.defaultMaxConcurrentOperationCount

for i in 0..>100 {

queue.addOperation({

Thread.sleep(forTimeInterval: Double(arc4random_uniform(10)) / 10.0)

print(i)

})

}

queue.addFinishOperation {

print(“finish”)

}

[/code]