0

このコードを実行すると...

-(IBAction)loginWithTwitter:(id)sender {
NSLog(@"Logging in with twitter");
ACAccountStore *accountStore = [[ACAccountStore alloc]init];
ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];

[accountStore requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) {
    if (error) {
        [self showError:error];
        return;
    }

    if (granted) {
        NSArray *accountsArray = [accountStore accountsWithAccountType:accountType];

        if ([accountsArray count] > 1) {
            NSLog(@"Multiple twitter accounts");
        }

        ACAccount *twitterAccount = [accountsArray objectAtIndex:0];
        NSLog(@"%@", twitterAccount);

        [self pushMainController];
    }
}];
}

が実際に呼び出されるまでに 5 ~ 10 秒の遅延がありpushMainControllerますが、アカウント情報は (事前承認後) すぐにログに記録されます。ただし、ブロックの後に呼び出しを移動するpushMainControllerと、すぐに発生します。唯一の問題は、ユーザーがその時点で必ずしもログインしているとは限らないことです。ネットワーク接続などの変数が原因で、ブロックが応答するまでに 1 秒かかる場合があることは理解していますが、これを理解するのを手伝ってくれる人はいますか?

4

1 に答える 1

0

完了ブロックはメインキューで実行されていません。UIコードがメインスレッドで実行されることを確認する必要があります。

[accountStore requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) {
    if (error) {
        [self showError:error];
        return;
    }

    if (granted) {
        NSArray *accountsArray = [accountStore accountsWithAccountType:accountType];

        if ([accountsArray count] > 1) {
            NSLog(@"Multiple twitter accounts");
        }

        ACAccount *twitterAccount = [accountsArray objectAtIndex:0];
        NSLog(@"%@", twitterAccount);

        dispatch_async(dispatch_get_main_queue(), ^{
            [self pushMainController];
        });
    }
}];

showError通話をラップする必要がある場合もあります。

于 2013-03-22T05:51:18.683 に答える