본문 바로가기

프로그래밍/iOS,macOS

비동기 처리 ( GCD , NSOperation )



NSObject

performSelectorInBackground:@selector(메쏘드) withObject:오브젝트 ];

performSelectorOnMainThread:@selector(메쏘드) withObject:오브젝트 waitUntilDone:YES];




GCD


시리얼 디스패치 큐와 컨커런트 디스패치 큐로 나뉘는데, 다중 작업을 처리하는 경우 Concurrent Dispatch Queue를 사용하며, 기타의 경우는 Serial Dispatch Queue를 사용한다. 

시스템의 메인큐는 Serial이고, 시스템 글로벌 큐는 Concurrent에 해당한다.




글로벌큐 얻기

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 )


메인큐 얻기(메인 쓰레드)

dispatch_get_main_queue()


신규 큐 생성

dispatch_queue_create( "큐 이름", DISPATCH_QUEUE_SERIAL ); // or DISPATCH_QUEUE_CONCURRENT



큐에 작업 넣기 : dispatch_async, dispatch_sync

dispatch_asysnc( 큐 , ^{

비동기로 실행할 구문

});



작업 그룹

dispatch_group_create();


큐와 그룹에 작업넣기

dispatch_group_async(그룹,큐,^{


});


위 그룹에 포함된 작업이 모두 종료되었을때 호출되는 블록

dispatch_group_notify(그룹,큐,^{

//

});


반대로 그룹 작업이 완료될때까지 기다리려면

dispatch_group_wait(그룹, 시간);




NSOperation


일반적으로 NSOperation을 직접 사용하지 않고, 이를 상속해 사용하던가 이미 구현된 서브 클래스인 NSInvocationOperation이나 NSBlockOperation을 사용한다. 



작업 블록으로 간단한 오퍼레이션 만들기

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock: ^{

// 작업할 내용

}];


기존 작업 블록에 새로운 작업 추가해 병렬로 작업을 처리할 수 있다.

[op addExecutionBlock: ^{


}];



오퍼레이션 상태에 관한 프로퍼티에관한 메쏘드를 제공한다. 

isCancelled

isAysnchronous

isExecuting

isFinished

isReady

dependencies

queuePriority

completionBlock



오퍼레이션간의 의존성 부여,제거

[오퍼레이션 addDependency:오퍼레이션];

[오퍼레이션 removeDependency:오퍼레이션];


오퍼레이션에 완료시 처리할 블록 추가 : [op setCompletionBlock:^{}];

op.completonBlock=^{

// 오퍼레이션 완료시 처리될 내용

};



오퍼레이션을 상속받는 경우 오버라이드해야 하는 메쏘드들은 아래와 같다. 해당 오퍼레이션은 사용자가 직접 구현한 것이므로, 작업 상태를 알수 있도록 상태 관련 메쏘드와 프로퍼티를 재정의 해주어야 한다.


컨커런트 오퍼레이션이 아닌 경우 이 메쏘드를 통해 필요한 코드를 추가한다.

-(void)main


컨커런트 오퍼레이션인 경우 아래의 메쏘드와 속성을 오버라이딩 해야 한다.

-(void)start

@property(readonly, getter=isAsynchronous) BOOL asynchronous

비동기 작업 여부


@property(readonly,getter=isExecuting) BOOL executing

작업 실행 여부


@property(readonly,getter="isFinished) BOOL finished




NSOperationQueue


operations

operationCount

maxConcurrentOperationCount

suspended

name



오퍼레이션 큐 생성

NSOperationQueue *queue = [[NSOperationQueue alloc]init];


이미 존재하는 메인큐를 가져오려면

NSOperationQueue *queue = [NSOperationQueue mainQueue];


큐에 작업 넣기

[queue addOperation:op];


큐에 블럭구문 직접 넣기

[queue addOperationWithBlock:^{

//

}];



동시 실행가능한 작업수 제한

[queue setMaxConcurrentOperationCount:1];



-(void)addOperations:(NSArray<NSOperation *> *)ops waitUntilFinished:(BOOL)wait;

오퍼레이션 배열을 등록한다. 전체 오퍼레이션이 끝나길 기다릴지 설정할 수 있다.


-(void)cancelAllOperations;

큐와 실행중인 오퍼레이션들을 모두 취소한다.


-(void)waitUntilAllOperationAreFinished;


'프로그래밍 > iOS,macOS' 카테고리의 다른 글

오토레이아웃 이것저것 / Constraint / UITextView  (0) 2016.10.25
커스텀객체와 인터페이스빌더  (0) 2016.10.23
스토리보드 / XIB  (0) 2016.10.22
싱글톤  (0) 2016.10.19
코어 데이터 정리  (0) 2016.10.18
슬라이드메뉴  (0) 2016.10.16
UITableView / UICollectionView  (0) 2016.10.16
파일 가져오기  (0) 2016.10.16
뷰 에니메이션  (0) 2016.10.13
[objective-c] 블록구문  (0) 2016.10.13