첫째는, NSOperationQueue
당신이 작업을 대기열하자, 즉,하는 start
방법, cancel
방법과 몇 가지 관찰 특성을 가진 비동기 작업의 일종이다 디스패치 큐 하나가 블록을 제출할 수 있습니다 동안 또는 마감 또는 기능을 디스패치 대기열에 보내면 실행됩니다.
"작업"은 의미 상 기본적으로 블록 (또는 폐쇄, 기능)과 다릅니다. 연산에는 기본 비동기 작업이 있지만 블록 (클로저 또는 함수)은 바로 그 작업입니다.
NSOperation
에 근접 무엇
는하지만, 인 비동기 기능, 예를 들면 : 선물와 지금
func asyncTask(param: Param, completion: (T?, Error?) ->())
우리가 같은 같은 비동기 함수를 정의 할 수 있습니다 :
func asyncTask(param: Param) -> Future<T>
을 이러한 비동기 함수는 매우 편리합니다. 선물은 map
및 flatMap
등등과 같은 콤비 기능을 가지고 있기 때문에
, 우리는 아주 쉽게 단지, 더 강력한 더 간결하고 더 이해할 수있는 방법으로, NSOperation
의 "종속"기능을 "모방"할 수 있습니다.
우리는 또한 GCD만을 기준으로 몇 줄의 코드와
NSOperationQueue
의 일종을 구현할 수
는 "maxConcurrentTasks"와 같은 "작업 대기열"과 기본적으로 동일한 기능을, 말하고 (작업 기능을 대기열하는 데 사용할 수 있습니다 작업이 아니라)보다 강력하고 간결하며 이해하기 쉬운 방법으로 제공됩니다. ;)
취소 가능한 작업을 얻으려면 NSOperation
의 하위 클래스를 만들어야하지만 비동기 함수 "ad-hod"- inline을 만들 수 있습니다.
또한 취소는 독립적 인 개념이기 때문에 구현이 GCD만을 기반으로하는 일부 라이브러리가 있다고 가정 할 수 있습니다.이 라이브러리는 일반적으로이 문제를 해결합니다.) 다음과 같이 보일 수 있습니다. :
self.cancellationRequest = CancellationRequest()
self.asyncTask(param: param, cancellationToken: cr.token).map { result in
...
}
이상 : 그래서
override func viewWillDisappear(_ animated: animated) {
super.viewWillDisappear(animated)
self.cancellationRequest.cancel()
}
, 정말 사용할 필요가 없습니다 이럴 어설픈 NSOperation
및 NSOperationQueue
및 이유 하위 클래스에 대한 더가 없습니다 NSOperation
입니다. 데이터 레이스에 신경 쓰지 않는 한 매우 정교하고 놀랍습니다.