programing

NSOperation vs Grand Central Dispatch

minimums 2023. 4. 13. 20:42
반응형

NSOperation vs Grand Central Dispatch

iOS 동시 프로그래밍에 대해 배우고 있습니다.지금까지 / 및 에 NSOperationQueue대해 읽었습니다.반복해서 사용하는 이유와 그 반대 이유는 무엇입니까?

GCD ★★★★★★★★★★★★★★★★★」NSOperationQueue NSThreads★★★★★, 이 가 명확하지 않기 을 주시면 감사하겠습니다.그러나 두 접근법의 관계는 명확하지 않으므로, 어떤 피드백이라도 감사해야 합니다.

GCD는 작업 기반의 동시성 모델을 매우 쉽게 사용할 수 있는 낮은 수준의 C 기반 API입니다. NSOperation ★★★★★★★★★★★★★★★★★」NSOperationQueueObjective-C 클래스입니다. NSOperation처음 도입되었지만 10.5iOS 2를 기준으로NSOperationQueue요.GCD.

일반적으로 자신의 요구에 맞는 최고 수준의 추상화를 사용해야 합니다., 보통 ,, 통, 통, 통, 통, 통, 보, 보, this, this, this, this, this, this, this를 사용합니다.NSOperationQueueGCDNSOperationQueue지원하지 않습니다.

:NSOperationQueue GCD로 할 수 .NSOperationQueue하게 이 많이 일GCD ( 한하는 대역폭 큐 . (예: 한 번에 N개의 동작만 실행하는 대역폭 제한 큐, 동작 간의 의존관계 확립. 다 매우 NSOperation, 매우 어렵다.GCDGCD를 하여 GCD와 함께 매우 NSOperation그럴 이유가 없다면 그들의 일을 이용하세요.

경고: 한편, 실제로 블록을 전송해야 하고 추가 기능이 필요하지 않은 경우NSOperationQueue GCD를업무에 적합한 도구인지 확인하세요.

관련 질문에 대한 답변에 따라 BJ의 의견에 동의하지 않고 먼저 GCD over NSOperation / NSOperation Queue를 검토하도록 제안합니다만, GCD가 필요로 하지 않는 경우입니다.

GCD 이전에는 동시성 관리를 위해 애플리케이션 내에서 NSOperations/NSOperationQueues를 많이 사용했습니다.그러나 GCD를 정기적으로 사용하기 시작한 이후 NSOperations 및 NSOperationQueues를 블록 및 디스패치 큐로 거의 완전히 대체했습니다.이것은, 양쪽의 테크놀로지를 실제로 사용해 온 방법과 그 테크놀로지에 대해서 실시한 프로파일링으로부터 얻을 수 있습니다.

첫째, NSOperations 및 NSOperationQueues를 사용할 때는 그다지 중요하지 않은 오버헤드가 발생합니다.이것은 코코아 오브젝트입니다.할당 및 할당해제가 필요합니다.60FPS에서 3-D 장면을 렌더링하는 iOS 어플리케이션에서는 NSOperations를 사용하여 렌더링된 각 프레임을 캡슐화하고 있었습니다.이 프로파일을 작성했을 때, 이러한 NSOperation의 작성과 해체는 실행 중인 애플리케이션의 CPU 사이클의 대부분을 차지해, 처리 속도가 저하되고 있었습니다.단순 블록과 GCD 시리얼 큐로 대체하여 오버헤드가 없어지고 렌더링 성능이 현저하게 향상되었습니다.NSOperations 사용으로 인한 오버헤드는 이 곳뿐만이 아닙니다. Mac과 iOS 모두에서 볼 수 있습니다.

둘째, NSOperation을 사용할 때 비교하기 어려운 블록 기반 디스패치 코드의 우아함이 있습니다.몇 줄의 코드를 블록에 싸서 시리얼 큐 또는 동시 큐에서 실행할 수 있도록 디스패치하는 것은 매우 편리합니다.이 경우 커스텀 NSOperation 또는 NSInvocation을 작성하려면 훨씬 더 많은 지원 코드가 필요합니다.NSBlock Operation을 사용할 수 있다는 것은 알고 있습니다만, 그 때는 GCD에 무언가를 디스패치하는 것이 좋을지도 모릅니다.이 코드를 블록으로 인라인으로 감싸고 응용 프로그램에서 관련 처리를 수행하면 이러한 작업을 캡슐화하는 별도의 메서드나 사용자 지정 NSOperation을 사용하는 것보다 더 나은 코드 구성이 가능합니다.

NSOperations 및 NSOperationQueues는 여전히 매우 유용하게 사용됩니다.GCD에는 실제 의존관계 개념이 없습니다.NSOperationQueues는 매우 복잡한 의존관계 그래프를 설정할 수 있습니다.소수의 경우 NSOperationQueues를 사용합니다.

전반적으로 저는 작업을 수행하는 가장 높은 수준의 추상화를 사용하는 것을 주창하지만, 이것은 GCD의 낮은 수준의 API를 주장하는 하나의 경우입니다.지금까지 이야기한 iOS 및 Mac 개발자 중 대부분은 OS 버전(iOS 4.0 및 Snow Leopard 이전 버전)을 지원하지 않는 한 NSOperations보다 GCD를 사용하는 것을 선택하고 있습니다.

GCD입 C 베 API 입 。
NSOperation ★★★★★★★★★★★★★★★★★」NSOperationQueueObjective-C 클래스입니다.
NSOperationQueue C 가 C 위에 있습니까?GCDNSOperation을 사용하는 경우 Grand Central Dispatch를 암묵적으로 사용합니다.

GCD NSOperation:
실장소
★★★의 GCD
NSOperationQueue

GCD에 비해 NSOperation의 이점:

합니다. 조작 시 제어
는 할 수 .NSOperation

ii 의존관계
개의 종속성을 할 수 .NSOperations
모든 종속성이 true를 반환할 때까지 작업이 시작되지 않습니다.

3) 3) 동작
준비 또는 완료, 구급 완료

의 수 최대 동작수
할 수 할 수 .

택택 를 선택하는 GCD ★★★★★★★★★★★★★★★★★」NSOperation
상기 모두)에, "(모두를 사용합니다.NSOperation를 줄이고 싶은 작업을 "에는 "로"를 사용합니다.GCD

참조:
https://cocoacasts.com/choosing-between-nsoperation-and-grand-central-dispatch/ http://iosinfopot.blogspot.in/2015/08/nsthread-vs-gcd-vs-nsoperationqueue.html http://nshipster.com/nsoperation/

GCD보다 NSOperation을 선호하는 또 다른 이유는 NSOperation의 취소 메커니즘입니다.예를 들어, 500px와 같은 앱은 수십 장의 사진을 보여주며 NSOperation을 사용하여 테이블 보기 또는 수집 보기를 스크롤할 때 보이지 않는 이미지 셀의 요청을 취소할 수 있으므로 앱의 성능을 크게 향상시키고 메모리 공간을 줄일 수 있습니다.GCD는 이를 쉽게 지원할 수 없습니다.

또한 NSOperation을 사용하면 KVO가 가능합니다.

여기 에스카톤에서 온 읽을 만한 기사가 있다.

GCD는 NSOperationQueue보다 레벨이 낮습니다.GCD의 주요 장점은 구현이 매우 가볍고 잠금 없는 알고리즘과 성능에 중점을 둔다는 것입니다.

NSOperationQueue는 GCD에서 사용할 수 없는 기능을 제공하지만 비용이 적게 듭니다. NSOperationQueue의 구현은 복잡하고 무겁고 많은 잠금을 수반하며 내부적으로만 GCD를 최소로 사용합니다.

NSOperationQueue에서 제공하는 설비가 꼭 필요하지만 GCD로 충분하다면 성능 향상, CPU 및 전력 비용 대폭 절감 및 유연성 향상을 위해 직접 사용할 것을 권장합니다.

NSQue Operations와 GCD는 모두 UI 애플리케이션 메인 트레드를 해제함으로써 별도의 스레드 상에서 백그라운드에서 무거운 계산 태스크를 실행할 수 있습니다.

이전 게시물에 따르면 NSOperations에 addDependency가 있어 순차적으로 작업을 큐잉할 수 있습니다.

그러나 dispatch_queue_create를 사용하여 큐에서 작업을 수행할 수 있는 GCD 시리얼 큐에 대해서도 읽었습니다.그러면 일련의 작업을 순차적으로 실행할 수 있습니다.

GCD에 비해 NSQue 운용상의 이점:

  1. 종속성을 추가할 수 있고 종속성을 제거할 수 있으므로 한 트랜잭션에 대해 종속성을 사용하여 순차적으로 실행하고 다른 트랜잭션에 대해 동시에 실행할 수 있습니다. 단, GCD는 이러한 방식으로 실행할 수 없습니다.

  2. 큐에 있으면 작업을 쉽게 취소할 수 있습니다.실행 중인 경우에는 작업을 중지할 수 있습니다.

  3. 최대 동시 작업 수를 정의할 수 있습니다.

  4. 큐에 있는 작업을 일시 중단할 수 있습니다.

  5. 대기열에 보류 중인 작업의 수를 확인할 수 있습니다.

GCD는 매우 사용하기 쉽습니다.배경에서 뭔가를 하고 싶다면 코드를 작성하여 백그라운드 큐에 디스패치하기만 하면 됩니다.NSOperation에서도 동일한 작업을 수행하는 것은 많은 추가 작업입니다.

NSOperation의 장점은 (a) 메시지를 보낼 수 있는 실제 개체가 있다는 것 및 (b) NSOperation을 취소할 수 있다는 것입니다.그것은 사소한 것이 아니다.NSOperation을 하위 분류해야 하며, 취소 및 작업 완료가 모두 올바르게 작동하도록 코드를 올바르게 작성해야 합니다.간단한 경우에는 GCD를 사용하고 복잡한 경우에는 NSOperation의 서브클래스를 만듭니다.(NSInvocation Operation 서브클래스와 NSBlock Operation 서브클래스가 있지만 GCD를 사용하면 모든 작업이 쉬워지기 때문에 사용할 이유가 없습니다).

NSOperations는 Grand Central Dispatch 위에 구축된 API일 뿐입니다.즉, NSOperations를 사용하는 경우에도 Grand Central Dispatch를 계속 사용할 수 있습니다.단지, NSOperations는, 마음에 드는 화려한 기능을 제공합니다.일부 작업은 다른 작업에 의존하도록 하거나 항목을 지정한 후 대기열을 재정렬하거나 기타 작업을 수행할 수 있습니다.실제로 ImageGrabber는 이미 NSOperations 및 운영 큐를 사용하고 있습니다.ASIHTTPRequest는 이러한 기능을 후드에서 사용하며, 필요에 따라 다른 동작에 사용하는 조작 큐를 구성할 수 있습니다.그래서 어떤 것을 사용해야 할까요?어느 것이든 당신의 앱에 맞는 것입니다.이 앱은 매우 심플하기 때문에 직접 Grand Central Dispatch를 사용했을 뿐 NSOperation의 화려한 기능은 필요 없습니다.하지만 앱에 필요하시다면 부담없이 사용하세요!

@Sangram과 다른 답변에는 동의하지만 몇 가지 포인트를 추가하고 싶습니다.내가 틀렸다면 정정해 주세요.

현재 @Sangram의 답변의 처음 두 요점은 유효하지 않다고 생각합니다(i. Control On Operation ii). 의존 관계).우리는 GCD를 통해서도 이 두 가지를 달성할 수 있다.코드로 설명하려고 합니다(코드 품질에 중점을 두지 마십시오.참고용입니다).

func methodsOfGCD() {
    
    let concurrentQueue = DispatchQueue.init(label: "MyQueue", qos: .background, attributes: .concurrent)
    
    
    //We can suspend and resume Like this
    concurrentQueue.suspend()
    concurrentQueue.resume()
    
    //We can cancel using DispatchWorkItem
    let workItem = DispatchWorkItem {
        print("Do something")
    }
    concurrentQueue.async(execute: workItem)
    workItem.cancel()
    
    //Cam add dependency like this.
    //Operation 1
    concurrentQueue.async(flags: .barrier) {
        print("Operation1")
    }

    //Operation 2
    concurrentQueue.async(flags: .barrier) {
        print("Operation2")
    }

    //Operation 3.
    //Operation 3 have dependency on Operation1 and Operation2. Once 1 and 2 will finish will execute Operation 3. Here operation queue work as a serial queue.
    concurrentQueue.async(flags: .barrier) {
        print("Operation3")

    }

}

언급URL : https://stackoverflow.com/questions/10373331/nsoperation-vs-grand-central-dispatch

반응형