태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

 

Cocoa 프로그래밍을 하다 보면 비동기 처리를 위해(대부분은 background thread에서 UI를 변경하거나 하는 경우) main thread에서 코드를 실행하도록 해야 하는 경우가 있는데, 이럴 때 보통 performOnMainThread를 사용하게 된다. 하지만 performOnMainThread는 하나의 selector만을 설정할 수 있기 때문에 여러 줄의 코드를 수행해야 하거나, argument가 여러 개 있을 경우 코드를 적기 불편해지는 경우가 있다. 이럴 경우 다음과 같이 dispatch_async() 함수를 사용하면 도움이 된다:


dispatch_async(dispatch_get_main_queue(), ^{

    // any codes to execute in main thread

});


위 코드는 iOS 4.0 SDK 이상에서부터 적용할 수 있다.



그 외에, 굳이 performOnMainThread 쪽을 선호한다면 block을 사용하는 방법도 생각해 볼 수 있다:

( 츌처: http://forrst.com/posts/performOnMainThread_Blocks-iks )


@interface NSObject (NPMainThreadBlocksPrivate)

- (void)_npMainThreadBlockExecute:(void (^)())theBlock;

@end


@implementation NSObject (NPMainThreadBlocks)

- (void)performBlockOnMainThread:(void (^)())theBlock waitUntilDone:(BOOL)wait {

        [self performSelectorOnMainThread:@selector(_npMainThreadBlockExecute:) withObject:theBlock waitUntilDone:wait];

}


- (void)performBlockOnMainThread:(void (^)())theBlock waitUntilDone:(BOOL)wait modes:(NSArray *)modes {

        [self performSelectorOnMainThread:@selector(_npMainThreadBlockExecute:) withObject:theBlock waitUntilDone:wait modes:modes];

}


- (void)_npMainThreadBlockExecute:(void (^)())theBlock {

        theBlock();

}

@end 



// 사용방법

[obj performBlockOnMainThread:^() {

// codes to execute here!

}

                          waitUntilDone:NO];