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