Programming/Mac & iOS

[iOS] NSOperation과 NSOperationQueue 개념과 사용

MB Kyle KWON 2015. 10. 17. 14:03

    비동기적 프로세싱을 위해서 iOS 플랫폼에서 GCD 디스패치를 주로 사용하게 된다. GCD는 개발자에게 복잡한 스케줄링 혹은 논리 구조로부터 해방시켜준다. 특히 Block Coding을 이용하여 단순 구현을 쉽게 만들어준다. 하지만 보다 복잡한 로직의 구현과 코드 재사용성을 높히기를 원한다면 NSOperation과 NSOperationQueue를 사용하면 좋다.


    NSOperation은 GCD처럼 비동기적 프로세싱을 위해서 안성맞춤이다. 대표적인 비동기 로직으로 네트워크나 파일I/O 등 엑세스 시간이 긴 작업들이 있다. 앞서 말한 비동기 로직을 처리할 때, 사용하면 된다.



NSOperation


    NSOperation의 구현은 마치 Java의 Thread 구현과 비슷하다. 먼저 알아두어야할 것은 NSOperation을 추상클래스이다. 당연히 직접 사용은 불가능하고 NSOperation을 상속하여 객체를 생성하거나 NSInvocationOpertaion이나 NSBlockOperation을 사용해야한다. Atomic Transaction 단위로 NSOperation을 구현해서 사용한다. 이번 포스트에서는 NSOperation을 사용해서 사용하는 법을 알아보려고 한다.


    NSOperation은 크게 3가지의 강력한 기능을 제공한다. Concurreny, Dependency, CompletionBlock 등이다. 여러 NSOperation을 동시 실행하도록 구현이 가능하며 Serial하게 실행 시킬 수도 있다. 혹은 NSOperation끼리 의존관계를 만들어 실행 순서를 설정할 수 있다. CompletionBlock을 이용하여 Operation의 실행이 마무리되고 실행해야할 로직을 설정할 수 있다. 하지만 CompletionBlock을 이용할 경우, return Value를 사용할 수 없다는 것을 고려해야한다.


    NSOperation을 사용하기 위해서는 위에서 말한 것 처럼 NSOPration을 상속해야한다. 상속을 받은 클래스에서 main 함수에서 자신이 실행하고자하는 atomic transaction을 오버라이딩 하면된다. 하지만 Concurrency를 고려하여 NSOperationd을 사용한다면 main 함수 외에도 start, asynchronous, executing, finished 등의 ㅎ마수와 프로퍼티도 추가 구현해줘야한다. 


    start 함수는 async 실행에 앞서 Tread-safe한 환경을 구축해줘야한다. 이를 위해서 Operation의 실행 상태를 확인해야하는데,  이데 사용되는 KVO property가 앞서 말했던 exciting과 finished이다.



NSOperationQueue


    NSOperationQueue는 NSOperation의 실행을 정형화 시켜준다. NSOperationQueue에 Operation이 추가되면 취소되거나 실행이 완료도리 때까지 queue에 남아있게 된다. operation의 실행은 개발자가 설정한 우선순위와 operation간의 dependency에 기반하여 자동으로 실행된다. 이에 앞서 개발자가 가장 고려해야할 부분은 inter-operation dependency를 조절하여 DeaLock과 BusyWating에 빠지게 하지 않도록 하는 것이다. NSOperationQueue는 NSOperation을 add하기만 하면된다. 개발자가 구현한대로 알아서 실행히셔줄 것이다. 




==== 예제 추가 예정 ====