2

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

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

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

  1. 正在连接……</p>

  2. 连接的

  3. 失败的

我在一个文件中有以下代码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];
}

请求完成并且我有帐户后,更新 UI 的最佳方式是什么?

我遇到了麻烦,因为请求是异步的,我无法在requestAccessToAccountsWithType块内返回任何值。还有一点是,如果我在它后面加上一些“ifs”来检查我的帐户是否为nil,它将在块执行完毕之前执行,所以帐户仍然是nil.

谢谢!

PS.:如果英文不够清楚,请见谅。

4

1 回答 1

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
}

ps 如果您不使用 arc,您还可以删除 dealloc 中的观察者:

 - (void)dealloc {
     [[NSNotificationCenter defaultCenter] removeObserver:self]; 
于 2013-05-08T08:37:56.593 回答