1

ユーザーがiPhone(iOS5以降)で設定したTwitterアカウントから選択する方法を実装しようとしています。ユーザー名をUIActionSheetに表示することはできますが、何らかの理由で、メソッドが呼び出されてからUIActionSheetが表示されるまでに約5秒かかります。

Twitterアカウントのリストを取得するのに時間がかかったせいかと思いましたが、私のログにはすぐに表示されるので、そうではありません。

何か案は?

- (void)TwitterSwitch {
    ACAccountStore *accountStore = [[ACAccountStore alloc] init];

// Create an account type that ensures Twitter accounts are retrieved.
    ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];

    NSMutableArray *buttonsArray = [NSMutableArray array];

// Request access from the user to use their Twitter accounts.
    [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) {


       // Get the list of Twitter accounts.
        NSArray *accountsArray = [accountStore accountsWithAccountType:accountType];

       NSLog(@"%@", accountsArray);


       [accountsArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

           [buttonsArray addObject:((ACAccount*)obj).username];
        }];


       NSLog(@"%@", buttonsArray);

        UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
        for( NSString *title in buttonsArray)
            [actionSheet addButtonWithTitle:title];
        [actionSheet addButtonWithTitle:@"Cancel"];
        actionSheet.cancelButtonIndex = actionSheet.numberOfButtons-1;
        [actionSheet showFromTabBar:self.tabBarController.tabBar];
}]; 

}
4

2 に答える 2

5

問題は、requestAccessToAccountsWithType:withCompletionHandler:ハンドラーを任意のキューで呼び出すことができ、そのハンドラー内からUI要素(アクションシート)を表示していることだと思います。UIとの対話はメインスレッドでのみ実行する必要があるため、これは問題になる可能性があります。コードの一部を別のメソッドに移動して、メインスレッドで呼び出してみました。これははるかに高速でした。

- (void)TwitterSwitch {
    ACAccountStore *accountStore = [[ACAccountStore alloc] init];

    // Create an account type that ensures Twitter accounts are retrieved.
    ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];


    // Request access from the user to use their Twitter accounts.
    [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) {


        // Get the list of Twitter accounts.
        NSArray *accountsArray = [accountStore accountsWithAccountType:accountType];

        NSLog(@"%@", accountsArray);
        [self performSelectorOnMainThread:@selector(populateSheetAndShow:) withObject:accountsArray waitUntilDone:NO];
        }];
}

-(void)populateSheetAndShow:(NSArray *) accountsArray {
    NSMutableArray *buttonsArray = [NSMutableArray array];
    [accountsArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

            [buttonsArray addObject:((ACAccount*)obj).username];
        }];


        NSLog(@"%@", buttonsArray);

        UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
        for( NSString *title in buttonsArray)
            [actionSheet addButtonWithTitle:title];
        [actionSheet addButtonWithTitle:@"Cancel"];
        actionSheet.cancelButtonIndex = actionSheet.numberOfButtons-1;
        [actionSheet showInView:self.view];
}

テストアプリにはタブバーコントローラーがなかったため、シートの表示方法を変更したことに注意してください。

于 2012-09-01T05:44:45.720 に答える
0

いつでもマルチスレッドを使用してタスクを高速化できます。これがあなたがそれをすることができる方法です:

dispatch_queue_t twitterAccounts = dispatch_queue_create("DisplayTwitterAccounts", NULL);
    dispatch_async(twitterAccounts, ^{
        dispatch_async(dispatch_get_main_queue(), ^{
        //Your Code goes here
        });
    });
dispatch_release(twitterAccounts);

dispatch_async(dispatch_get_main_queue())に注意してください:これは、UIKit呼び出しがメインスレッドでのみ発生する可能性があるためです。(参照:スタンフォードCS193Pコーススライド)。

「DisplayTwitterAccounts」はキューの名前にすぎないため、デバッガー/コンソールで検索できます。

于 2012-09-01T05:09:07.377 に答える