NSOperation 멀티스레드에 대한 간단한 이해

5043 단어
1. 간단한 설명
NSOperation의 작업: NSOperation과 NSOperationQueue를 함께 사용해도 다중 루틴 프로그래밍을 실현할 수 있고 NSOperation은 start 방법을 조정하여 작업을 수행할 수 있지만 기본적으로 동기화됩니다.
NSOperationQueue: NSOperationQueue(작업 대기열)에 NSOperation을 추가하면 NSOperation의 작업 추가 작업이 NSOperationQueue에 자동으로 비동기적으로 수행되고 작업이 자동으로 실행되며 스레드가 자동으로 켜집니다.
NSOperation 및 NSOperationQueue의 멀티스레드 구현 단계:
(1) 먼저 수행해야 할 작업을 NSOperation 객체로 캡슐화합니다.
(2) NSOperation 객체를 NSOperationQueue에 추가
(3) 시스템이 NSOperationQueue의 NSOperation을 제거합니다.
(4) 제거된 NSOperation 캡슐화 작업을 새 스레드에 배치합니다.
2. NSOperation의 하위 클래스
NSOperation 은 추상 클래스로서, 봉인 작업 능력을 갖추지 못하므로, 반드시 그 하위 클래스를
NSOperation 클래스를 사용하는 3가지 방법은 다음과 같습니다.
(1)NSInvocationOperation
(2)NSBlockOperation
(3) 자정의 자류가 NSOperation을 계승하여 내부 상응하는 법을 실현한다.
(4) NSOperation 은 대기열의 취소, 일시 정지, 복구를 할 수 있습니다. : tableview , , UI , 。 , UI( ) , ( ), , 。
NSOperation 은 작업을 실행하기 위해 start 방법을 조정할 수 있지만, 기본값은 동기화됩니다.
    //1.    NSInvocationOperation       
        NSInvocationOperation *invocationOperation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationOperationAction) object:nil];
     //2.      
        [invocationOperation start];

  //1.   NSBlockOperation    
     NSBlockOperation *blockOperation=[NSBlockOperation blockOperationWithBlock:^{
       
     }];
     //2.        
     [blockOperation start];

//**  :             ,                。      ,           queue ,      。   NSOperation    NSOperationQueue ,         **

NSBlockOperation의 캡슐화된 작업 수 > 1이면 비동기적으로 수행됩니다.
  //  NSBlockOperation    
       NSBlockOperation *blockOperation=[NSBlockOperation blockOperationWithBlock:^{
              
        }];
        //    
        [blockOperation addExecutionBlock:^{
       
             }];
      //    
       [blockOperation addExecutionBlock:^{
           
         }];
       //      
      [blockOperation start];

//**  :  NSBlockOperation       > 1,         **


NSOperationQueue에 작업 추가, 작업 자동화, 스레드 자동 켜기
**               **
   //     NSOperationQueue
         NSOperationQueue *operationQueue=[[NSOperationQueue alloc]init];
     
    //       NSOperation
     NSInvocationOperation *operationOne=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationOneAction) object:nil];
    NSInvocationOperation *operationTwo=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationTwoAction) object:nil];
     NSBlockOperation *blockOperation=[NSBlockOperation blockOperationWithBlock:^{
         
     
     }];
    //               
     
        [operationQueue addOperation:operationOne];
        [operationQueue addOperation:operationTwo];
        [operationQueue addOperation:blockOperation];

 **               **
 [operationQueue addOperationWithBlock:^{
           
            }]

NSOperation 설정 운영 의존성
//     NSOperationQueue
         NSOperationQueue *operationQueue=[[NSOperationQueue alloc]init];
     
    //       NSOperation
     NSInvocationOperation *operationOne=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationOneAction) object:nil];
    NSInvocationOperation *operationTwo=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationTwoAction) object:nil];
     NSBlockOperation *blockOperation=[NSBlockOperation blockOperationWithBlock:^{
         
     
     }];

    //      
        //   operationTwo,   operationOne,    blockOperation

        [blockOperation addDependency:operationOne];
        [operationOne addDependency:operationTwo];


  //         

         [operationQueue addOperation:operationOne];
        [operationQueue addOperation:operationTwo];
        [operationQueue addOperation:blockOperation];


NSOperationQueue 스레드 대기열 완료finished 상태 감지
우리는 대기열이 완성된 후에 작업을 해야 할 때가 많은데, 언제 대기열이 완성될지 NSOperationQueue는 내장된didFinishedSelector가 사용되지 않기 때문에 스스로 상태를 검사해야 한다.NSOperationQueue는 키-value coding(KVC) and 키-value observing(KVO) 메커니즘을 호환하기 때문에 NSOperationQueue의 속성을 관찰할 수 있습니다.NSOperationQueue에서 모니터링하고 관찰할 수 있는 속성은 다음과 같습니다. operations 、operationCount、maxConcurrentOperationCount、suspended
    self.operationQueue  =[[NSOperationQueue alloc]init];
   [ self.operationQueue  addObserver:self forKeyPath:@"operations" options:0 context:nil];

  • KVO,parseQueue가 실행되었는지 관찰
  • - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context
    {
        if (object == self.operationQueue && [keyPath isEqualToString:@"operations"])
        {
            if (0 == self.operationQueue.operations.count)
            {
                NSLog(@"=======parse finished=======");
            }
        }
        else
        {
            [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
        }
    }
    

    좋은 웹페이지 즐겨찾기