Приведенный ниже код пытается лениво войти в Facebook прямо перед публикацией фотографии, но имеет асинхронную проблему.В журналах after isSessionValid block
появится до fbDidLogin
, а затем произойдет facebookErrDomain error 10000
(«OAuthException», «должен использоваться активный токен доступа» и т. Д.).
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
if (![appDelegate.facebook isSessionValid]) {
[appDelegate.facebook authorize:[NSArray arrayWithObjects:@"publish_stream", @"user_photos", nil]];
}
NSLog(@"after isSessionValid block");
NSData *imageData = UIImageJPEGRepresentation(image, 1);
NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
FACEBOOK_APP_ID, @"app_id",
imageData, @"source",
message, @"message",
nil];
[appDelegate.facebook requestWithGraphPath:@"me/photos" andParams:params andHttpMethod:@"POST" andDelegate:self];
Здесьэто fbDidLogin
в MyAppDelegate
- (void)fbDidLogin {
NSLog(@"fbDidLogin");
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
[defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
[defaults synchronize];
}
Я понимаю, что facebook requestWithGraphPath
работает до fbDidLogin
на FBSessionDelegate
, но не уверен, что лучший способ получить код под after isSessionValid block
оператор лога, и он будет работать внутри fbDidLogin
?
Вопрос
Мне бы хотелось иметь API в стиле completionHandler
, как показано ниже.Есть ли простой способ сделать это?В качестве альтернативы, есть ли хороший способ добавить обратный вызов или блок к MyAppDelegate
, который будет вызван один раз из fbDidLogin
, а затем удален?
[appDelegate.facebook authorize:array completionHandler:^(BOOL success) {
// other setup stuff from first example
[appDelegate.facebook requestWithGraphPath:@"me/photos" andParams:params andHttpMethod:@"POST" andDelegate:self];
}];
Обновление
Ответ на Как реагировать на асинхронные события (логин)? может быть то, что я ищу.