在requestAccessToAccountsWithType之后更新UI

时间:2013-05-07 02:59:22

标签: facebook macos cocoa slrequest

我正在开发一个应用程序来帮助我理解OBJECTIVE-X / OSX。

该应用只需连接到Facebook并使用NSUserNotification发送通知。 它工作正常,但现在我想添加一些用户界面。

为了使示例更简单,我想更新标签(NSTextField)以显示Facebook连接的状态。

  1. 连接...

  2. 连接

  3. 失败

  4. 我在一个文件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。:如果不够清楚,请抱歉。

1 个答案:

答案 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];