それはあなたが何を意味するかによって異なります。サンプルコードを考えると、ネストされたブロックが完了すると、関数がブロックを呼び出すように思われます。したがって、次のようなものが必要です。
+ (void)doMyThingWithBlock:(void(^)(void))block
{
FBRequest *request = [FBRequest requestForGraphPath:kFacebookQueryMeKey];
[request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
// do whatever you want with the connection ...
if (block) block();
}];
}
一方、外側の関数は、ネストされたブロックが完了するまで待ってから戻るようにしたい場合があります。その場合は、もう少し複雑です。次のように、ブロックが完了するのを待つためにロックを使用する必要があります。
#define kMyThingNotDone 0
#define kMyThingDone 1
+ (void)doMyThingAndWait
{
NSConditionLock *lock = [[NSConditionLock alloc] initWithCondition:kMyThingNotDone];
FBRequest *request = [FBRequest requestForGraphPath:kFacebookQueryMeKey];
[request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
// do whatever you want with the connection ...
[lock lock];
[lock unlockWithCondition:kMyThingDone];
}];
[lock lockWhenCondition:kMyThingDone];
[lock unlock];
}
注意してください。メイン スレッドでこれを実行したくない場合は、ユーザー インターフェイスをロックしてください。また、これを呼び出すスレッドで何かが発生するのをリクエストが待機しないようにする必要があります。そうしないと、デッドロックが発生します。