20160823 GCD와 NSOperation 비교

3076 단어 iphone개발하다
다중 루틴 조작에 대해 대부분의 개발자들이 GCD를 채택하여 실현할 것이다. 확실히 GCD는 강력한 부분이 있지만 백엔드 조작을 실행할 때 GCD는 가장 좋은 방식이 아니다. 애플이 봉인하여 내놓은 기술인 NSOperationQueueue는 본고가 그 사용을 소개하는 것이 아니라 비교이다.
하나.NSOperationQueue 및 NSOperation
NSOPeration 객체에서 작업을 캡슐화합니다.
NSOperationQueue에 NSOperation 객체 추가
NSOperationQueue에서 NSOperation을 제거합니다.
제거된 NSOperation 캡슐화를 새 스레드에 배치하여 실행
NSOperation 은 추상 클래스 로, 그녀 는 두 개의 하위 클래스 NSInvocation Operation 과 NSBlockOperation 을 가지고 있다
둘.Compare
GCD는 순수 C의 API로 GCD에서 임무는 블록으로 나타낸다. 블록은 경량급의 데이터 구조이고 조작(Operation)은 중량급의 대상이다. 때로는 대상을 사용하는 데 가져오는 비용이 적고 가져오는 이익이 많다.NSOperationQueue를 사용하면 다음과 같은 이점이 있습니다.
① 작업을 취소합니다.만약 조작된 대기열을 사용한다면, 취소 조작이 비교적 편리하고 cancel 방법을 호출할 수 있으며, GCD의 구조는 일단 시작하면 취소하기 어렵다. GCD의 구조는 Fire and forget이다
② 작업 간의 의존 관계를 지정합니다.하나의 조작이 완성되고, 다음 조작이 실행되도록 지정할 수 있으며, 다른 말은 특정한 조작이 반드시 다른 조작이 순조롭게 완성되어야 실행할 수 있도록 하는 것이다.
③ 작업의 우선 순위를 지정합니다.
④ 키 값 관측 메커니즘을 통해 NSOperation 객체의 속성을 모니터링할 수 있습니다.
⑤ NSOperation 대상을 다시 사용하면 자신이 하나의 클래스를 써서 NSOperation을 계승할 수 있어 확장성이 좋다.
요약: 다중 스레드와 작업 관리 문제를 해결할 때 대기열을 보내는 것은 유일한 방안이 아니다.작업 대기열은 GCD의 대부분 기능을 실현할 수 있고 더욱 복잡한 작업을 완성할 수 있는 고위층 OC API를 제공한다.
문제: 개발 과정에서 이런 문제에 부딪히지 않습니까? 어떤 조작은 반드시 어떤 조작이 끝난 후에 실행해야 합니까?예를 들어 다운로드 후속 작업은 반드시 다운로드가 끝난 후에 조작해야 한다.
시도: DispatchGroup 메커니즘을 통해 시스템 리소스의 상태에 따라 작업을 수행합니다.
dispatchGroup은 GCD의 특성으로 임무를 그룹으로 나눌 수 있습니다. 호출자는 이 작업이 끝날 때까지 기다릴 수도 있고, 리셋 함수를 제공한 후에 계속 실행할 수도 있습니다. 이 작업이 끝날 때 호출자는 알림을 받을 수 있습니다.그중에 중요한 특성이 하나 있는데, 실행할 여러 개의 임무를 한 조로 합치는 것입니다. 이 조의 임무가 완성되면 알림을 받을 것입니다.
다음은 코드에서 설명한 문제입니다.
다음 코드를 참고할 수 있습니다
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t dispatchGroup = dispatch_group_create();
    
    //do some object perform Task
    for (id object in ) {
        dispatch_group_async(dispatchGroup, queue, ^{
            //object perform tasks
        });
    }
    dispatch_queue_t notifyQueue = dispatch_get_main_queue();
    dispatch_group_notify(dispatchGroup, notifyQueue, ^{
        //continue processing after completing tasks
    });

아마 다음 코드가 더 이해하기 쉬울 거예요.
dispatch_queue_t dispatchQueue = dispatch_queue_create("sw.queue...", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t dispatchGroup = dispatch_group_create();
    dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
        NSLog(@"dispatch-1");
    });
    dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
        NSLog(@"dspatch-2");
    });
    dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
        NSLog(@"end");
    });

위의 두 단락의 코드를 비교하면 원리는 같다.
첫 번째 코드는 모든collection을 옮겨다니며 요소마다 작업을 수행합니다. 이 동작은 다른 GCD 함수로 할 수 있습니다.
4
  void dispatch_apply(size_t iterations, dispatch_queue_t queue, ^(size_t)block)
관심이 있으면 연구할 수 있다.
총괄: 일련의 작업은 디스패치 그룹에 귀속될 수 있으며 개발자는 이 그룹의 작업이 완료되었을 때 알림을 받을 수 있으며 디스패치 그룹을 통해 병렬 발송 대기열에서 여러 가지 작업을 동시에 수행할 수 있다.이 경우 GCD는 시스템 리소스 상황에 따라 이러한 동시 작업을 스케줄링합니다.
본문
끝!

좋은 웹페이지 즐겨찾기