다중 스레드 기술의 NSOperation

4587 단어
앞에서 ios에서 세 가지 다중 스레드 기술의 NSThread를 소개했고 본고는 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은 스레드 조작을 처리하고, 통합을 통해 당신이 필요로 하는 조작을 완성할 수 있습니다.

좋은 웹페이지 즐겨찾기