2

OBJECTIVE-X/OSX を理解するのに役立つアプリを開発しています。

アプリは単に Facebook に接続し、 を使用して通知を送信しNSUserNotificationます。正常に動作していますが、UI をミックスに追加したいと考えています。

例を簡単にするために、ラベル ( NSTextField) を更新して、Facebook 接続のステータスを表示したいと考えています。

  1. 接続中…</p>

  2. 接続済み

  3. 失敗した

1つのファイルに次のコードがあります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リクエストが非同期で、ブロック内で値を返すことができないため、問題が発生しています。もう 1 つのポイントは、アカウントが nil であるかどうかを確認するために「if」を配置すると、ブロックの実行が完了する前に実行されるため、アカウントは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 に答える