본문 바로가기

Software/iOS & Objective-C

멀티스레딩 <NSThread>


멀티스레딩은 한 앱의 내부에서 돌고있는 스레드가 다수인 경우를 뜻한다.

하나의 앱은 하나의 프로세스가 돌고 있습니다.
그리고 프로세스 안에는 여러개의 스레드가 돌고있는 구조이다.
스레드는 프로세스보다 낮은 작업 단위이다.

스레드는 코드를 실행하는 흐름이라고 볼 수도 있다.
멀티스레드라 하면 흐름이 여러개라고 보면 되겠다.

앱에는 최소 한개 이상의 스레드가 돌고 있다.
스레드가 없다면 그것은 프로그램으로서 성립이 안된다.

최초의 첫 스레드를 메인 스레드라고 한다.

메인 스레드에서는 많은 일을 한다.
기본적인 앱 내부의 이벤트 처리나 화면 처리를 하기 때문에
메인 스레드가 멈추거나 일시적으로 어는 현상이 있어서는 안된다.

= NSThread.h =
+ (NSThread *) currentThread;
클래스 함수 이다.

[NSThread currentThread]를 호출하면 이 코드르를 실행하는 스레드 관리 객체를 돌려준다.

+(void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument
돌려주는것은 없는(void)로 바로 스레드를 생성.

스레드는 한 함수를 관리한다.
때문에 새로운 스레드가 실행되면서 함수를 실행하고. 함수가 끝나면 자연히 스레드가 종료된다.
그래서 함수 내부에서 무한 루프를 돌리면 스레드가 죽지않고 유지된다.

메인스레드의 이벤트루프가 이런 원리이다.
이벤트루프에서 나와서 스레드가 끝난다는 것은 앱의 종료를 의미한다.

스레드를 만들어보자!
[NSThread detachNewThreadSelector:@selector(_th) toTarget:self withObject:nil];

-(void)_th{
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   while(YES) {
          NSString *t = [NSString stringWithFormat:@"%i", [_lavel.text intValue] + i];
          [self performSelectorOnMainThread:@selector(mainThreadSetText:) withObject:t waitUntilDone:YES];
          //위 함수로 설정한 함수를 메인스레드에서 실행하면서 인자로 객체를 전달할 수 있다.
   }
   [pool release];
}
-(void)mainThreadSetText:(NSString *)text {
    -lebel.text = text;
}
될 수 있으면 멀티스레드에서 사용할 함수는 메인스레드에서 사용하지 않도록 구분하라.


반응형