NSOperation의 기본 사용

5022 단어
NSOperation 소개
  • NSOperation은 GCD의 포장을 바탕으로 하고 그 밑바닥은 사실 GCD
  • 이다.
  • 핵심 개념
  • 대기열 + 작업
  • 왜 이런 종류를 봉해야 합니까?
  • 이것은OC이기 때문에 더욱 대상을 대상으로 하고 속성과 방법을 직접 호출할 수 있다
  • NSOperation의 역할
  • NSOperation 및 NSOperationQueue와 함께 멀티스레드 프로그래밍 가능
  • NSOperation 및 NSOperationQueue 멀티스레드 구현을 위한 구체적인 절차
  • 먼저 수행해야 할 작업을 NSOperation 객체에 캡슐화
  • NSOperation 객체를 NSOperationQueue에 추가
  • NSOperationQueue의 NSOperation을 자동으로 제거
  • 제거된 NSOperation 캡슐화된 작업을 새 스레드에 배치
  • NSOperation의 기본 사용
  • NSOperation 자체는 추상 클래스이며 하위 클래스만 있음
  • 세 개의 하위 클래스는 NSBlockOperation, NSInvocationOperation 및 NSOperation에서 사용자 정의로 계승된 클래스
  • 이다.
  • NSOperation과 NSOperationQueue를 결합하여 다중 스레드 동시 사용
  • NSInvocationOperation
  •     //1.    
              :    
              :         ,        
              :         ,         ,     nil
    
        NSInvocationOperation *operation = [[NSInvocationOperation alloc]
                                            initWithTarget:self selector:@selector(sel) object:nil];
    
        //2.    
        [operation start];
    
    #  :   start          ,              
    #       NSOperation    NSOperationQueue ,         
    
  • NSBlockOperation
  • //1.    
    
         NSBlockOperation        ,          
    
        NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
            //       
            NSLog(@"---download1--%@",[NSThread currentThread]);
        }];
    
        //2.    ,            
        [operation addExecutionBlock:^{
            NSLog(@"---download2--%@",[NSThread currentThread]);
        }];
    
        [operation addExecutionBlock:^{
             NSLog(@"---download3--%@",[NSThread currentThread]);
        }];
    
        //3.      
        [operation start];
    
    #  :  NSBlockOperation       > 1,        (        )
    

    기본 단계:
    1. 포장 작업 2.대기열 만들기(기본적으로 동시 대기열) 3, 대기열에 작업 추가
  • 간편한 방법
  • //대기열 생성 NSOperationQueue *queue//대기열에 제출 작업 [queue addOperationWithBlock:^ {작업}]
  • NSOperation 사용자 정의의 이점
  • 코드 복용에 유리하다.코드 숨김에 유리하다.구체적인 실현 코드는 NSOperation의 클래스 안의main 방법을 계승하여 실현한다.
  • NSOperation의 두 큐
  • 홈팀열은mainQueue를 통해 획득되며, 홈팀열에 넣은 임무는 모두 메인 라인에서 실행됩니다
  • 비주열 직접alloc init에서 나온 대기열.비홈팀 열은 병렬 및 직렬 기능을 모두 갖추고 있으며, 최대 병렬 수 속성을 설정하여 작업이 병렬 또는 직렬 실행인지 제어
  • 최대 동시 설정
  • //1.    
     NSOperationQueue *queue = [[NSOperationQueue alloc]init]; 
    //2.        
    //   :                    
    //                   
    //         1,         ,    1       
    //              , -1,        0,           
    queue.maxConcurrentOperationCount = 2;
    
    
  • 일시 중지 복구 및 취소
  • //       
     //suspended   YES    ,suspended   NO    
     //                  ,           
    if (self.queue.isSuspended) { 
        self.queue.suspended = NO; 
    }else { 
        self.queue.suspended = YES;
     }
     //            
    //    ,                    ,         ,                    
     //           
     [self.queue cancelAllOperations];
    
    
  • 운영 의존도
  • NSOperation 간에 종속 보장 실행 순서를 설정할 수 있음
  • : 예를 들어 A를 실행한 후에야 B를 실행할 수 있다. [operationA addDependency:operationB];

  • 참고: 작업 A는 작업 B에 의존하고 B는 작업 A에 의존할 수 없습니다.
    NSOperation 은 스레드 간 통신 지원
     //1.    
        NSOperationQueue *queue =[[NSOperationQueue alloc]init];
        
        //2.    
        NSBlockOperation *download1 = [NSBlockOperation blockOperationWithBlock:^{
            //2.1   url
            NSURL *url = [NSURL URLWithString:@"http://img.qiyenet.net/upload/image/2016/03/05/1457133748832510.png"];
            
            //2.2           
            NSData *data = [NSData dataWithContentsOfURL:url];
            
            //2.3     
            self.image1 = [UIImage imageWithData:data];
        }];
        //3.    2
        NSBlockOperation *download2 = [NSBlockOperation blockOperationWithBlock:^{
            //3.1   url
            NSURL *url = [NSURL URLWithString:@"http://www.52tq.net/uploads/allimg/160226/1021043B3-3.jpg"];
            
            //3.2           
            NSData *data = [NSData dataWithContentsOfURL:url];
            
            //3.3    
            self.image2 = [UIImage imageWithData:data];
        }];
        
        //4.    
        NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
            
            UIGraphicsBeginImageContext(CGSizeMake(200, 200));
            [self.image1 drawInRect:CGRectMake(0, 0, 100, 200)];
            [self.image2 drawInRect:CGRectMake(100, 0, 100, 200)];
            self.image1 = nil;
            self.image2 = nil;
            
            UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
            
            //     
            [[NSOperationQueue mainQueue]addOperationWithBlock:^{
                self.imageView.image = image;    
            }];
        }];    
        [op addObserver:self forKeyPath:@"isFinished" options:NSKeyValueObservingOptionNew context:nil];
        
       //5.      
        [op addDependency:download1];
        [op addDependency:download2];
        
        //6.       
        [queue addOperation:op];
        [queue addOperation:download1];
        [queue addOperation:download2];
    
    
    

    좋은 웹페이지 즐겨찾기