をNSNotificationCenterを使用するか、または書くことができます。したがって、たとえば...
MyObj.h:
// create a typedef for our type of completion handler, to make
// syntax cleaner elsewhere
typedef void (^MyObjDoJobCompletionHandler)(void);
@interface MyObj
- (void)doJobWithCompletionHandler:(MyObjDoJobCompletionHandler)completionHandler;
@end
がMyObj.m:SomeInterface.m以内
- (void)doJobWithCompletionHandler:(MyObjDoJobCompletionHandler)completionHandler
{
/* do job here ... */
// we're done, so give the completion handler a shout.
// We call it exactly like a C function:
completionHandler();
/* alternatives would have been to let GCD dispatch it,
but that would lead to discussion of GCD and a bunch of
thread safety issues that aren't really relevant */
}
:
-(void)DoSomething
{
MyObj * mo = [MyObj new];
[mo doJobWithCompletionHandler:
^() // you can omit the brackets if there are no parameters, but
// that's a special case and I don't want to complicate things...
{
NSLog(@"whoop whoop, job was done");
// do a bunch more stuff here
}
];
}
私は現実にいると仮定DoJob
で非同期になってしまう何かをやっているのです(そうでなければ、メソッドが戻るまで待つだけです)。その場合は、GCDのdispatch_async
とdispatch_get_main_queue
の結果を使用して、補完ハンドラがメインスレッド上で確実に行われるようにすることができます。
Joachim Bengtssonがa good introductory guide to blocksと書いています。グランドセントラルディスパッチ(Grand Central Dispatch)とのやり方(そしてGCDの一般的な使い方)に関しては、Apple's documentationが良いです。
ありがとうございますtommy! – Nils
私の名前がグーグルであることは信じられないほど明白です: Pしかし、ジョブを表すオブジェクトがある場合、多分NSOperationQueueはGCDより良くフィットします。 – nevyn