본문 바로가기

TechLog

performOnMainThread 대신 dispatch_async() 사용하여 코드 블럭 실행하기

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];