2012年2月20日月曜日

非同期メソッドを同期実行する方法

completionHandlerを引数に取るCocoaの非同期メソッドを同期実行したい場合、あまりスマートな方法ではないですが、下記の例のようにすると同期実行できます。completionHandlerはメソッドを呼び出したスレッドと同じスレッドで実行されますので、run loopをまわさないでNSLockなどで同期しようとするとデッドロックになることに注意。

__block BOOL finished = NO;

[[NSWorkspace sharedWorkspace] recycleURLs:trashURLs
 completionHandler:^(NSDictionary *newURLs, NSError *error) {
 finished = YES;
 }];

while(finished == NO) {
 [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
}

0 件のコメント:

コメントを投稿