다중 스레드 기술의 NSOperation
환경 정보: Mac OS X 10.1 Xcode 6.1.1 iOS 8.1
본문: 1. NSOperation의 소개는 NSOperation의 추상적인 정도가 NSThread보다 높다. 이것은 애플이 라인을 대상으로 봉인하는 것이다.NSOperation은 하나의 독립된 계산 단원을 의미하는데, 추상 클래스로서, 당신은 그의 하위 클래스를 실례로 말해야 합니까?NSInvocationOperation/?구체적인 작업을 수행하려면 NSBlockOperation을 사용하십시오.실례화된 후에 start 방법을 호출하거나 NSOperationQueue 작업 대기열에 가입하면 실행을 시작할 수 있습니다.
2. NSOperation의 사용 1.NSInvocation Operation 직접 시작
// operation start , ,
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(threadLoadImage:) object:imageView];
[op start];
2. NSOperationQueue를 사용하여 NSOperation 관리 및 비동기식 스레드 설정
//
@property (strong, nonatomic) NSOperationQueue *queue;
//
self.queue = [[NSOperationQueue alloc] init];
// NSInvocationOperation
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(threadLoadImage:) object:imageView];
// NSInvocationOperation , , , start
[self.queue addOperation:op];
3. NSOperationQueue 관리 및 NSBlockOperation으로 스레드 설정
NS Block Operation 과 NS Invocation Operation 은 본질적 인 차이 가 없지만, NS Block Operation 은 코드 블록 을 사용하는 것 이 좀 더 편리할 뿐 이다
// NSBlockOperation
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
//
[self operationLoadImage:imageView];
}];
//
[self.queue addOperation:op];
4. 주 스레드에서 작업 수행
// UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[imageView setImage:image];
}];
5. 라인 간의 의존 관계 추가
대기열에 직접 작업을 추가하면 동시에 실행됩니다. 누가 먼저, 누가 나중에 시스템에서 호출되었는지, 특정한 시간에 작업의 실행 순서를 제어해야 하기 때문에ddDependency 작업에 사용됩니다.addDependency: NSOperation의 구성원 방법입니다. 이 방법을 호출한 NSOperation 대상은 매개 변수가 실행된 후에 실행됩니다.대기열에 작업을 추가하기 전에 의존 관계를 추가해야 합니다.
//
NSBlockOperation *op1 =[NSBlockOperation blockOperationWithBlock:^{
NSLog(@" %@", [NSThread currentThread]);
}];
NSBlockOperation *op2 =[NSBlockOperation blockOperationWithBlock:^{
NSLog(@" %@", [NSThread currentThread]);
}];
NSBlockOperation *op3 =[NSBlockOperation blockOperationWithBlock:^{
NSLog(@" %@", [NSThread currentThread]);
}];
// ,
// : ,
[op2 addDependency:op1];
[op3 addDependency:op2];
// ,
[self.queue addOperation:op3];
[self.queue addOperation:op1];
[self.queue addOperation:op2];
6. 스레드 병렬 수 제어
// , ,
self.queue.maxConcurrentOperationCount = 1;
7. 작업 취소
NSOperation에는 자신의 상태를 표시하는 일련의 속성이 있는데, isReady→?isExecuting →??isFinish.스레드 start 후 즉시 실행하는 것이 아니라, 시스템 스케줄링에 의해 실행되는 준비된 상태로 들어갑니다.때때로 취소 작업이 필요할 수도 있습니다. - (void) cancel을 호출할 수 있습니다.아직 실행되지 않은 불필요한 라인을 멈추자.
for (NSOperation *operation in self.queue.operations) {
// NSOperation
[operation cancel];
}
8. NSOperation에 완성 코드 블록 추가
예를 들어 소설 한 권을 다운로드할 때 다운로드가 끝났다는 통지를 보내야 한다. 이때 NSOperation의completionBlock 속성을 사용해서 조작을 수행할 수 있다.
operation.completionBlock = ^{
NSLog(@" ");
};
9. 우선 순위
NSThread와 마찬가지로 NSOperation은threadPriority 속성을 통해 우선 순위를 지정할 수 있습니다.그러나 IOS8에서 라인이라는 개념은 애플 프레임워크에서 체계적으로 무시되었다.threadPriority는 NSQualityOfService 속성으로 대체되었다. 다음은 NSQualityOfService의 몇 가지 열거이다.
typedef NS_ENUM(NSInteger, NSQualityOfService) {
/* , */
NSQualityOfServiceUserInteractive = 0x21,
/* , 。 App */
NSQualityOfServiceUserInitiated = 0x19,
/* 。 , App 5 。 , */
NSQualityOfServiceUtility = 0x11,
/* , , App */
NSQualityOfServiceBackground = 0x09,
/* */
NSQualityOfServiceDefault = -1
} NS_ENUM_AVAILABLE(10_10, 8_0);
3. NSOperation 요약
1. NSOperation은 스레드 실행 순서를 쉽게 제어합니다.
2. NSBlockOperation을 사용하면 블록 코드를 사용할 수 있으며 단일 스레드 방법을 사용하지 않아도 여러 개의 매개 변수를 쉽게 전달할 수 있다.
3. 라인의 병발수를 제어하여 라인을 효과적으로 제어할 수 있다
4. 코드 블록을 완성하기 위해 라인을 추가하고 필요한 조작을 수행할 수 있습니다
GCD는 이미 유행이 되었지만 일부 프레임워크에서, 예를 들어AFNetworking이나 NSOperation을 사용하여 라인과 관련된 작업을 완성한다. 프레임워크를 사용하는 NSInvocation Operation/?NSBlockOperation은 스레드 조작을 처리하고, 통합을 통해 당신이 필요로 하는 조작을 완성할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.