当我打开Facebook会话时,一切正常,完成块被调用。
[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
NSLog(@"openSession handler");
}];
但是后来当我要求额外的权限时,两个完成块不仅被调用,而且还被调用。
[FBSession.activeSession reauthorizeWithReadPermissions:
[NSArray arrayWithObject:@"user_photos"]
completionHandler:^(FBSession *session, NSError *error) {
NSLog(@"reauthorize handler");
}];
这是一个错误还是它应该是这样的?我该如何避免这种行为?是否可以在通话后删除完成块?
我查看了美味的样本,行为完全相同。当应用程序请求发布权限时,将调用发布完成块并再次调用登录块。
我正在测试iOS5和Facebook-ios-sdk 3.1.1
答案 0 :(得分:5)
从我从API的API文档中收集到的内容,这是一种预期的行为(不是好的设计恕我直言,但这是另一个故事)。
在completionHandler参数描述中的片段:
“......每次会话时,FBSession对象都会调用该块 改变状态“
我无法为您提供解决方案,但我可以提供解决方法:
// <Your description of why the workaround is needed.
//
// REF: http://stackoverflow.com/questions/12751635/facebook-ios-sdk-3-1-1-fbsession-completionhandler-not-removed
//
__block BOOL workaroundOneTimeRunFlag = NO;
[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error)
{
if (!workaroundOneTimeRunFlag)
{
workaroundOneTimeRunFlag = YES;
// Your handler was executed for the first time
// Run some code...
}
}];
答案 1 :(得分:3)
这不是一个错误,SDK会有意调用这两个处理程序。如docs中所述,只要发生会话状态更改,就会调用openActiveSession的处理程序。要求额外的权限会将状态更改为FBSessionStateTokenExtended;因此,第一个处理程序被调用,然后是你在reauthorizeWithReadPermissions中提供的显式处理程序: