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
'ios 뽀개기 > objective-c' 카테고리의 다른 글
ios 카메라를 만드는 두가지 방법 - 설명 (0) | 2018.12.04 |
---|---|
ios 카메라를 만드는 두가지 방법 2 (0) | 2018.12.03 |
ios objective c - http 네트워크 통신 1 (0) | 2018.11.14 |
ios objective c 코어오디오 다루기 6 - 오디오 파일 변환 (0) | 2018.11.13 |
ios AVFoundation으로 오디오 플레이어 만들기 (0) | 2018.11.10 |
댓글