프로그래밍/Object-C2011. 9. 4. 17:48
복잡한 앱에서는 메인 스레드 외에 추가로 스레드를 생성하여 사용해야 할 때가 잦다. 스레드를 구현하는 방법에는 NSInvocationOperation을 이용하는 방법과 NSOperation을 이용하는 방법이 있다.
  두 가지 방법 모두, 아래에 보인 코드처럼 스레드를 저장하는 NSOperationQueue 타입의 큐를 만들어 사용한다. 스레드는 이 큐에 차례대로 저장된다. setMaxConcurrentOperationCount: 메소드를 호출하여 동시에 실행되는 최대 스레드 수를 지정할 수 있다.


  먼저 NSInvocationOperation을 사용하는 방법을 알아보자. 이 방법을 이용하면 간단하게 메소드 하나로 스레드를 구현할 수 있다.
  우선 스레드로 실행하고 싶은 내용을 하나의 메소드(아래 코드의 function1:)로 구현한다. 메소드 내부에는 기본적으로 스레드를 이용하여 실행해야 하는 내용을 넣고, 메소드의 마지막 부분에서 performSelectorOnMainThread:withObject:waitUntilDone: 메소드를 호출하여 메인 스레드 내의 특정 메소드(function2:)를 호출한다.
  다음에는 생성한 메소드(function1:)를 이용하여 NSInvocationOperation 타입의 변수(아래 코드의 operation 변수)를 생성한다. 이처럼 생성된 NSInvocationOperation 타입의 변수가 바로 스레드를 이용하여 수행되는 하나의 실행 단위가 된다. 이러한 NSInvocationOperation 타입의 변수는 미리 만들어둔 NSOperationOperation 타입의 큐에 addOperation: 메소드를 이용하여 추가되며, 이후 별도의 스레드에 의해 실행된다.
  이 방식은 메인 스레드에서 스레드의 종료 시점을 정확히 알 수 있어서 스레드 사이의 동기화 및 이를 이용한 각종 기능을 구현하기가 쉽다. 물론 이 부분은 생략할 수도 있다.



이번에는 NSOperation을 이용하는 방법을 알아보자. 메소드 하나로 간단하게 구현한 방법과는 달리 클래스 상속이 필요한데, 다소 복잡한 내용을 처리할 때 유용하게 사용될 수 있다.
  우선 아래와 같이 NSOperation 클래스를 상속하여 새로운 클래스를 하나 생성하고, init으로 시작하는 이름의 초기화 메소드를 하나 만든다. 여기에서는 간단하게 파라미터 하나만 넘겨받는 초기화 메소드를 만들었다.
  다음에는 main 함수를 만들고 내부에 스레드를 처리하는 코드를 작성한다. 이때 앞에서 설명한 것처럼 메소드 마지막에 메인 스레드의 다른 메소드를 호출하는 것도 가능하다.

MyThreadOperation.h



MyThreadOperation.m


다음의 코드는 이 클래스로부터 생성된 변수를 스레드 큐에 추가하는 과정이다. NSOperation를 상속한 MyThreadOperation 클래스를 사용하는 것이 다르다.



주의해야 할 사항은 화면 갱식과 관련된 메소드들은 반드시 사용자가 생성한 스레드가 아닌, 메인 스레드에서 호출되어야 한다는 것이다. 이를 제대로 지키지 않으면 화면 일부가 깨지는 등 비정상적인 상황이 발생할 수 있다.

출처 - 도전! 아이폰4 프로그래밍






'프로그래밍 > Object-C' 카테고리의 다른 글

View(뷰)의 계층구조  (0) 2011.09.04
NSThread 예제  (0) 2011.09.04
객체 제거하기(메모리 해제)  (0) 2011.09.04
객체 사용하기(메모리 관리)  (0) 2011.09.04
객체 생성하기(메모리 할당과 초기화)  (0) 2011.09.04
Posted by 건깡