我正在开发一个应用程序来帮助我理解OBJECTIVE-X / OSX。
该应用只需连接到Facebook并使用NSUserNotification
发送通知。
它工作正常,但现在我想添加一些用户界面。
为了使示例更简单,我想更新标签(NSTextField
)以显示Facebook连接的状态。
连接...
连接
失败
我在一个文件FacebookRequest.m
- (void) connectFacebook{
if(self.account == nil){
self.account = [[ACAccountStore alloc]init];
}
ACAccountType *facebookAccount = [self.account
accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
NSDictionary *options = @{
ACFacebookAppIdKey: @"MY_CODE",
ACFacebookPermissionsKey: @[@"email",
@"user_about_me",
@"user_likes",
@"manage_notifications",
@"user_activities"],
ACFacebookAudienceKey: ACFacebookAudienceFriends
};
[self.account requestAccessToAccountsWithType:facebookAccount
options:options
completion:^(BOOL success, NSError *error){
if(success){
NSArray *accounts = [self.account accountsWithAccountType:facebookAccount];
self.account = [accounts lastObject];
}
else{
NSLog(@"Erro %@", [error description]);
}
}];
}
以及我AppDelegate.m
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[self.statusFacebook setStringValue:@"Connecting…"];
FacebookRequest *request = [[FacebookRequest alloc]init];
[request connectFacebook];
}
请求完成后我有帐户更新用户界面的最佳方法是什么?
我遇到了麻烦,因为请求是异步的,我无法在requestAccessToAccountsWithType
块内返回任何值。另一点是,如果我放一些“ifs”来检查我的帐户是否为零后,它将在块执行完毕之前执行,因此该帐户仍然是nil
。
谢谢!
PS。:如果不够清楚,请抱歉。
答案 0 :(得分:1)
您可以将NSNotificationCenter
用于此目的:
[self.account requestAccessToAccountsWithType:facebookAccount
options:options
completion:^(BOOL success, NSError *error){
if(success){
NSArray *accounts = [self.account accountsWithAccountType:facebookAccount];
self.account = [accounts lastObject];
// You post a notification that the UI should update here
[[NSNotificationCenter defaultCenter] postNotificationName:@"UpdateUI" object:nil];
}
else{
NSLog(@"Erro %@", [error description]);
}
}];
然后,添加应该更新其UI的viewController作为此通知的观察者:
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateUI) name:@"UpdateUI" object:nil];
}
- (void)updateUI {
// Here you actually update your UI
}
P.S。如果你没有使用弧,你也会删除dealloc中的观察者:
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];