본문 바로가기
ios 뽀개기/objective-c

objective c nsoperation 예제

by 인생여희 2018. 11. 27.
반응형

objective c nsoperation 예제

 개념정리

 

 #.

 NSOperation =.  하나의 작업 단위.

 NSOperation 모델링 상태, 우선순위, 의존성, 관리를 지원하는 추상 클래스이다.

 NSOperation 상속하여 커스텀 클래스를 만들어 활용함.

 

 #.

 네트워크 요청, 이미지 리사이즈, 텍스트 처리, 또는 기타 다양한 반복처리등을 처리하는 NSOperation 있을때,

  특정 작업이 담겨있는 NSOperation 객체는 혼자서 일을 없다.

 이러한 작업을 진행해주는 녀석이 NSOperationQueue이다.

 

 #.

 NSOperationQueue : NSOperationQueue 작업의 동시 실행을 조절

 기본적으로는 First-In-First-Out으로 동작

 maxConcurrentOperationCount 프로퍼티로 특정시간 동안 동시에 실행 가능한 작업의 숫자를 정함.

 

 

 - 스레드를 이용하여 병렬처리하기 3가지 방법

 1. GCD

 2. NSThread

 3. NSOperationQueue

 


 -NSOperationQueue 이용해서 병렬처리 하기 순서

 

1.새로운 NSOperationQueue 작성

2.작성한 operationQueue 병렬로 실행하고 싶은 처리(operation) 넣기



 1.작업간 의존성 부여해서 특정 작업이 끝난 수행할 특정 작업 추가  : addDependency

   제거 : removeDependency

 

 )

 MyLengthOperation *mylengthOperation = [[MyLengthOperation alloc]init];

 MyCalcOperation *calcOperation = [[MyCalcOperation alloc]init];

 [mylengthOperation addDependency:calcOperation];

 

 

 2. setCompletionBlock 메소드로 block 등록하면 작업이 완료된 후에 block 수행

 

 )

 MyLengthOperation *mylengthOperation = [[MyLengthOperation alloc]init];

 [mylengthOperation setCompletionBlock:^{

     NSLog(@"Complete");

     }] ;

 [mylengthOperation start];

 

 

 3. UI작업은 mainThread에서 처리

 

 )

     NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];

         [mainQueue addOperationWithBlock:^{

         // UI 갱신은 메인쓰레드에서!

         [self.tableView reloadData];

         [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];

         }];

 


 예제



 


//

//  ViewController.m

//  NSOperationQ

//

//  Created by 위피아 on 26/11/2018.

//  Copyright © 2018 위피아. All rights reserved.

//


#import "ViewController.h"

#import "MyLengthOperation.h"

#import "MyCalcOperation.h"


@interface ViewController (){

@private

NSOperationQueue    *queue;

}

@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

   

    MyLengthOperation *mylengthOperation = [[MyLengthOperation alloc]init];

    mylengthOperation.queuePriority = NSOperationQueuePriorityHigh;

    

    

     MyCalcOperation *calcOperation = [[MyCalcOperation alloc]init];

     calcOperation.queuePriority = NSOperationQueuePriorityHigh;

    


    if(queue == nil){

        queue = [[NSOperationQueue alloc]init];

        [queue setMaxConcurrentOperationCount:5];

         NSLog(@" !NSOperationQueue가 없어서 생성했습니다!!!!!");

    }else{

         NSLog(@"  NSOperationQueue가 있어요!!!!!");

    }

    

    [queue addOperation:mylengthOperation];

    [queue addOperation:calcOperation];

    

    

     //[mylengthOperation addDependency:calcOperation];

     //[mylengthOperation cancel];


}



- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}



@end





//

//  MyLengthOperation.m

//  NSOperationQ

//

//  Created by 위피아 on 26/11/2018.

//  Copyright © 2018 위피아. All rights reserved.

//


#import "MyLengthOperation.h"


@implementation MyLengthOperation


- (void)main

{

    

    NSLog(@"MyLengthOperation  #############################");

    for (int i = 0; i < 1000; i++) {

        if ( self.isCancelled ) {

            break;

        }

        NSLog(@"%f  #####################", sqrt(i));

    }

}



@end


//

//  MyCalcOperation.m

//  NSOperationQ

//

//  Created by 위피아 on 26/11/2018.

//  Copyright © 2018 위피아. All rights reserved.

//


#import "MyCalcOperation.h"


@implementation MyCalcOperation



- (void)main

{

    

    NSLog(@"MyCalcOperation ***************************");

    for (int i = 0; i < 1000; i++) {

        if ( self.isCancelled ) {

            break;

        }

        NSLog(@"%f   ***************************", sqrt(i));

    }

}



@end




반응형

댓글