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];
'TechLog' 카테고리의 다른 글
PEP-0020 파이썬 선(禪)(The Zen of Python) 한글 번역 (0) | 2013.05.24 |
---|---|
PEP-0008 파이썬 코드 스타일 가이드(Style Guide for Python Code) 한글 번역 (1) | 2013.05.24 |
Portable Django & Python for Mac OS X (0) | 2012.12.14 |
코코아 응용 프로그램에서 터미널 커맨드 실행하기 (0) | 2012.09.08 |
App Store, Google Play, Windows Phone Marketplace에게 있어 개발자란 무엇인가 (0) | 2012.08.25 |