2017-04-05 9 views
8

나는 조금 더 깊은 동시성에 뛰어 들고 있으며 GCD와 NSOperation에 대해 광범위하게 읽었습니다. 그러나 캐논 answer on SO과 같은 게시물은 수십 년 전입니다. (가장 높은 수준의 추상화와 같은 간단한 파견 이상을 일반적으로 "이동하는 방법"2017/Swift 3.1 - GCD와 NSOperation

  • :

    NSOperation 주요 장점은 성능이 약간의 비용으로, 될하는 데 사용 나에게 듯

  • 이 작업 조작 (취소 등)
  • 쉽게 작업 사이의 종속성을 설정하는 쉬운 많이 만들기 위해) GCD의 꼭대기에 내장

감안할 때 GCD의 DispatchWorkItem & 블록 취소/특히 DispatchGroup/qos, 인센티브 (현명한 비용 성능)이 실행 시작했을 때 당신이 작업을 취소 할 수 있어야합니다 경우에서 떨어져 동시성을 위해 더 이상 NSOperation를 사용하는 정말이 나 작업 상태를 쿼리합니까?

애플은 최소한 WWDC에서 (적어도 NSOperation보다 최근에 부여 된) GCD에 훨씬 더 중점을 둔 것처럼 보입니다.

답변

4

나는 아직도 그들 자신의 목적을 가지고있는 그들을 봅니다. 방금 최근에 WWDC에서 2015 년에이 문제에 대한 이야기를 되풀이했습니다 (고급 NSOperations). 여기에 두 가지 요점이 있습니다.

이야기에서

실행 시간 & 사용자 상호 작용

:

NSOperations은 더 이상 당신이 블록을 실행하는 데 예상보다 조금 동안 실행, 블록은 일반적으로 몇 나노초을, 그래서 어쩌면 실행하려면 최대 1 밀리 초.

NSOperations, 다른 한편으로는, 심지어 몇 분 밀리 초 몇에서

그들이 NSOperation이 존재하는 WWDC의 앱에 대해 이야기 예제 더 이상 아무 곳이 될 수있다 로그인 한 사용자에 대한 의존성이 있습니다. 종속성 NSOperation은 로그인보기 컨트롤러를 제공하고 사용자가 인증 할 때까지 대기합니다. 끝나면 NSOperation이 끝나고 NSOperationQueue가 작업을 다시 시작합니다. 이 시나리오에서는 GCD를 사용하고 싶지 않습니다.

NSOperations 그냥 수업을하기 때문에, 당신이 그들에서 더 많은 재사용을 얻기 위해 그들을 하위 클래스

하위 클래스. 이것은 GCD에서는 불가능합니다.

예 : (위에서 WWDC 로그인 시나리오를 사용하여)

당신은 인증을이를 필요로하는 사용자 상호 작용과 관련된 귀하의 코드베이스에서 많은 NSOperations 있습니다. (이 예제에서는 비디오를 좋아해요.) NSOperation을 확장하여 AuthenticatedOperation을 만든 다음 모든 NSOperations가이 새로운 클래스를 확장하도록 할 수 있습니다.

1

첫째는, NSOperationQueue 당신이 작업을 대기열하자, 즉,하는 start 방법, cancel 방법과 몇 가지 관찰 특성을 가진 비동기 작업의 일종이다 디스패치 큐 하나가 블록을 제출할 수 있습니다 동안 또는 마감 또는 기능을 디스패치 대기열에 보내면 실행됩니다.

"작업"은 의미 상 기본적으로 블록 (또는 폐쇄, 기능)과 다릅니다. 연산에는 기본 비동기 작업이 있지만 블록 (클로저 또는 함수)은 바로 그 작업입니다.

NSOperation에 근접 무엇

는하지만, 인 비동기 기능, 예를 들면 : 선물와 지금

func asyncTask(param: Param, completion: (T?, Error?) ->()) 

우리가 같은 같은 비동기 함수를 정의 할 수 있습니다 :

func asyncTask(param: Param) -> Future<T> 

을 이러한 비동기 함수는 매우 편리합니다. 선물은 mapflatMap 등등과 같은 콤비 기능을 가지고 있기 때문에

, 우리는 아주 쉽게 단지, 더 강력한 더 간결하고 더 이해할 수있는 방법으로, 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() 
} 

, 정말 사용할 필요가 없습니다 이럴 어설픈 NSOperationNSOperationQueue 및 이유 하위 클래스에 대한 더가 없습니다 NSOperation입니다. 데이터 레이스에 신경 쓰지 않는 한 매우 정교하고 놀랍습니다.