Я создал оболочку для iOS SDK FBConnect, которая объявляет свойство блока для выполнения некоторого кода после успешного входа в систему.Соответствующий код выглядит следующим образом:
typedef void(^FacebookServiceLoginBlock)(BOOL loginSuccessful);
@interface FacebookService : NSObject <FBSessionDelegate,FBRequestDelegate>
@property (nonatomic, copy) FacebookServiceLoginBlock loginBlock;
- (void) checkAuthorization:(FacebookServiceLoginBlock)loginBlock;
@end
@implementation FacebookService
@synthesize loginBlock;
- (void) checkAuthorization:(FacebookServiceLoginBlock)block {
if (![self.facebook isSessionValid]) {
self.loginBlock = block;
// do Facebook auth
} else {
if (block) {
block(YES);
}
}
}
- (void)fbDidLogin {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[self.facebook accessToken] forKey:@"FBAccessTokenKey"];
[defaults setObject:[self.facebook expirationDate] forKey:@"FBExpirationDateKey"];
[defaults synchronize];
self.loginBlock(YES);
}
Вызывающий код просто вызывает метод checkAuthentication с блоком, который практически ничего не делает, только одна строка типа int i=0;
, поэтому я могу добавить точку останова,В случае, если пользователь уже вошел в систему и блок вызывается немедленно, все работает нормально.Однако, если происходит аутентификация FB, и приложение переключается на Safari или приложение FB для авторизации, по возвращении, когда вызывается делегат успешного входа в FB, приложение падает на self.loginBlock(YES)
;Если я оберну его в if (self.loginBlock
), он будет пропущен, что заставит меня поверить, что это свойство равно nil, но если я напечатаю описание в отладчике, оно получит имя класса " FacebookService ».Другое важное замечание, это под ARC.
Я действительно нахожусь в тупике, любая помощь будет отличной.