Это зависит от того, что вы имеете в виду. Учитывая ваш пример кода, кажется, что вы хотите, чтобы ваша функция вызывала блок, когда завершается вложенный блок. Так что вы хотели бы что-то вроде этого:
+ (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];
}
Будьте осторожны - вы не хотите, чтобы сделать это в главном потоке, или вы будете запирать пользовательский интерфейс. Вы также должны быть уверены, что запрос не будет ждать, пока что-нибудь случится в потоке, на который вы это вызвали, иначе у вас будет тупик.