iOS - NSOperation 및 NSOperationQueue

5026 단어
  :Mitchell 

1. NSOperation 소개
  • NSOperation의 역할은 NSOperation과 NSOperationQueue를 사용해도 다중 루틴 프로그래밍을 실현할 수 있다
  • NSOperation 및 NSOperationQueue 멀티스레드 구현을 위한 구체적인 절차
  • 먼저 수행해야 할 작업을 NSOperation 객체에 캡슐화
  • NSOperation 객체를 NSOperationQueue에 추가
  • NSOperationQueue의 NSOperation을 자동으로 제거
  • 제거된 NSOperation 캡슐화된 작업을 새 스레드에 배치
  • 간단한 생성:
  • 큐 만들기
  • 직접 만들기:alloc/init -->기본값은 병렬 -->직렬
  • 마스터 대열:mainQueue
  • NSOperation에 추가된 방법이 없어서 봉인할 수 없기 때문에 직접 사용할 수 없습니다. 두 가지 작업 방식: NSInvocationOperation、NSBlockOperation


  • 2. NSInvocation Operation
  • NSOperation에 조작 방법이 추가되지 않았기 때문에 NSOperation을 직접 사용할 수 없습니다. NSInvocation Operation, NSBlockOperation을 사용하여 만듭니다:
  • NSInvocation Operation 생성 단계:
  • 1. Operation에 작업 봉인
  • 2, 포장 작업 수행
  • 참고: NSInvocation Operation에서 직접 수행하는 경우 기본적으로 주 스레드에서 수행됩니다
  • .
        NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(demo) object:nil];
        [op1 start];
    

    3. NSBlockOperation
  • 생성 프로세스
  • 1. Operation에 작업 봉인
  • 2, 추가 작업
  • 참고:
  • 한 동작만 봉인하면 기본적으로 주 라인에서 실행됩니다
  • 여러 개의 조작을 봉인하면 첫 번째 조작을 제외한 다른 조작은 라인에서 실행됩니다

  •   //1、      Operation 
        NSBlockOperation*op = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"1 - %@",[NSThread currentThread]);
        }];
        //2、    
        //          ,           
        //         ,           ,            
        [op addExecutionBlock:^{
              NSLog(@"2 - %@",[NSThread currentThread]);
        }];
        [op addExecutionBlock:^{
              NSLog(@"3 - %@",[NSThread currentThread]);
        }];
    

    4. 사용자 정의 Operation
  • 패키지 작업:
  • 사용자 정의 클래스 계승과 NSOperation이라면 사용자 정의 클래스의main 방법에 조작을 써야 한다
  • 이런 실현 방식은 코드의 복용성을 높일 수 있다( block main )
  • MitchellOperation*op = [[MitchellOperation alloc]init];
        [op start];
    
    #import "MitchellOperation.h"
    @implementation MitchellOperation
    -(void)main{
    //           
        NSLog(@"%s%@",__func__,[NSThread currentThread]);
    }
    @end
    

    5. NSOperationQueue
  • 생성 순서:
  • 봉인 작업
  • 대기열에 작업 추가
  • 참고:
  • 자신이 만든 대기열에 작업을 추가하면 대기열 내부에서 start를 자동으로 호출합니다.
  • 대기열에 작업을 추가하면 새로운 실행 대기열이 열립니다
  • 들어오는 Block에 따라 NSBlockOperation 객체 만들기
  • 생성된 NSBlockOperation 객체를 대기열에 추가

  •  1、    
        NSOperationQueue *queue = [[NSOperationQueue alloc]init];
     2、    
     2.1 NSInvocationOperation
        NSInvocationOperation*op1 =   [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(demo) object:nil];
     2.2 NSBlockOperation
        NSBlockOperation*op2 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"%@",[NSThread currentThread]);
        }];
     3、        
        [queue addOperation:op1];
        [queue addOperation:op2]; 
    

    6. NSOperationQueue의 직렬 및 동시
  • 기본값은 동시
  • 직렬을 구현하려면 설정maxConcurrentOperationCount = 0
  • 주의: 최대 병발수는 비트 0을 설정할 수 없습니다. 그렇지 않으면 작업이 실행되지 않습니다. 메인 라인에서 작업을 수행하려면mainQueue를 직접 만들면 됩니다.

  • 7. NSOperationQueue 일시 중지, 복구, 취소
  • 대기열에서 작업 일시 중지
  • YES는 일시 중지 필요
  • NO 복구 실행
  • 재작업 수행 중 대기열의 작업을 일시 중지하면 현재 실행 중인 작업은 일시 중지되지 않고 대기열의 다음 작업이 일시 중지됩니다.
  • 복구 작업은 대기열의 첫 번째 실행되지 않은 작업에서 시작합니다.


  •     self.queue.suspended = !self.queue.suspended;
    

    + 작업 취소: - * 작업을 일시 중지한 것처럼 취소해도 현재 실행 중인 작업은 취소되지 않습니다.*그래서 시간을 소모하는 조작을 실행할 때 코드를 한 단락씩 실행한 후에 현재 조작이 취소되었는지 판단해야 성능을 절약할 수 있다.
        [self.queue cancelAllOperations];
    

    8. NSOperationQueue 작업 간의 의존과 감청
  • 의존도:
  •     [op2 addDependency:op1];
    
  • 수신:
  • op1.completionBlock = ^(){
            NSLog(@"  1    ");
        };
    
  • 인스턴스
  • NSOperationQueue*queue = [[NSOperationQueue alloc]init];
        //      
        NSOperation*op1 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"  1");
        }];
        //      
        NSOperation*op2 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"  2");
        }];
        NSOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"  3");
            //        
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                NSLog(@"  ");
            }];
        }];
        //          
        op1.completionBlock = ^(){
            NSLog(@"  1    ");
        };
        op2.completionBlock = ^(){
            NSLog(@"  2    ");
        };
        //    
        //       ,               ,        
        //  :
        //1、    ,        
        //2、NSOperation         
        [op2 addDependency:op1];
        [op3 addDependency:op2];
        [queue addOperation:op1];
        [queue addOperation:op2];
        [queue addOperation:op3];
    

    좋은 웹페이지 즐겨찾기