Самое простое решение - передать блок завершения, который может быть выполнен после завершения входа в систему. Кроме того, вы можете передать блок, который вызывается в случае ошибки. В моих приложениях я обернул это в шаблон «ответчик», где вы определяете класс, который содержит блок завершения и ошибки. Это передается в качестве аргумента асинхронным методам. Единственный улов здесь заключается в том, что вы должны написать логин, чтобы «выполнить» блоки в соответствующее время.
Я реализовал этот шаблон несколько раз в приложениях, которые используют асинхронные API (включая Facebook SDK).
ОБНОВЛЕНИЕ (добавлено несколько примеров кода):
В простейшей форме вы можете просто добавить блок завершения. Во-первых, вы хотите создать typedef для вашего блока завершения. В этом случае мы будем использовать блок, который не возвращает значения и имеет идентификатор ввода:
typedef void (^successBlock)(id);
Далее вы можете создать контроллер, который создает фасад для вашего взаимодействия с классом Facebook. В этом случае вы можете создать метод входа в систему с такой подписью (предполагается, что у вас есть iVar типа successBlock):
- (void)loginWithCompletionHandler:(successBlock)handler
{
// If you aren't using ARC - you'll need to use Block_copy(handler)
completionHandler = handler;
[facebook authorize:facebookSettings.defaultPermissions
delegate:self];
}
Наконец, в вашей реализации FBSessionDelegate вы можете выполнить этот блок:
#pragma mark - FBSessionDelegate Implementation
- (void)fbDidLogin
{
// Store Facebook token, etc.....
if( completionHandler )
{
// You could pass any data you want in this data property
completionHandler(data);
}
}
}
Шаблон «Ответчик», о котором я упоминал выше, немного сложнее, чем этот, но этого должно быть достаточно, чтобы вы начали.