Вопрос

I'm developing an app to help me understand OBJECTIVE-X/OSX.

The app simply connects to Facebook and sends a notification using NSUserNotification. It is working fine, but now I want to add some UI to the mix.

To make the example simpler, I want to update a label (NSTextField) to show the status of the Facebook connection.

  1. Connecting…

  2. Connected

  3. Failed

I have the following code in one File 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]);
        }

    }];

}

and the following one in my AppDelegate.m

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [self.statusFacebook setStringValue:@"Connecting…"];
    FacebookRequest *request = [[FacebookRequest alloc]init];
    [request connectFacebook];
}

What is the best way to update the UI after the request is complete and I have an account?

I'm having troubles since the request is asynchronous and I can't return any value inside the requestAccessToAccountsWithType block. Another point is that if I put some "ifs" to check if my account is nil after it, it will be executed before the block has finished executing, so the account would still be nil.

Thanks!

PS.: Sorry for the English if it is not clear enough.

Это было полезно?

Решение

You may use NSNotificationCenter for this purpose:

[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]);
        }

    }];

Then, you add your viewController that should update its UI as an observer of this notification:

- (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. if you are not using arc you also remove the observer in dealloc:

 - (void)dealloc {
     [[NSNotificationCenter defaultCenter] removeObserver:self]; 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top