20160823 GCD와 NSOperation 비교
하나.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는 시스템 리소스 상황에 따라 이러한 동시 작업을 스케줄링합니다.
본문
끝!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
스프라이트킷 모험 pt2이제 해당 연료에 애니메이션을 적용하여 소비량을 반영해 보겠습니다. 우리가 여기까지 온 방법에 관심이 있다면 여기로 이동하여 . 그러나 당신이 속도를 낼 수 있다면, 그것을 시작합시다! 설명에서 언급했듯이 내 아이디...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.