3

私はTWrequestと協力して、Twitterリストをテーブルビューで表示しています。次のコードは機能します。問題は、テーブルの更新が非常に遅いことです。私は要求応答をNSloggingしています(これは非常に迅速に発生します)。また、各リストをループして、リスト'name'を配列に追加しています(これも非常に迅速に<1秒で発生します)。ただし、説明のつかない理由により、テーブルの更新にはさらに約4秒かかります。

テーブルのリロードにこれほど時間がかかるのはなぜですか?問題は応答を解析することではありません(nslogでこれが非常に迅速に発生することがわかるため)、テーブルに表示するのに長い時間がかかりますか?非常に感謝しています!

-(IBAction)getLists{

    //  First, we need to obtain the account instance for the user's Twitter account
    ACAccountStore *store = [[ACAccountStore alloc] init];

    ACAccountType *twitterAccountType = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];

    //  Request permission from the user to access the available Twitter accounts
    [store requestAccessToAccountsWithType:twitterAccountType withCompletionHandler:^(BOOL granted, NSError *error) {

        if (!granted) {
            // The user rejected your request
            NSLog(@"User rejected access to the account.");
        }
        else {

            // Grab the available accounts
            twitterAccounts = [store accountsWithAccountType:twitterAccountType];

            if ([twitterAccounts count] > 0) {

                // Use the first account for simplicity
                ACAccount *account = [twitterAccounts objectAtIndex:0];

                // Now make an authenticated request to our endpoint
                NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
                //[params setObject:@"1" forKey:@"include_entities"];

                //  The endpoint that we wish to call
                NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1.1/lists/list.json"];

                //  Build the request with our parameter
                TWRequest *request = [[TWRequest alloc] initWithURL:url parameters:params requestMethod:TWRequestMethodGET];

                // Attach the account object to this request
                [request setAccount:account];

                [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {

                    if (!responseData) {
                        // inspect the contents of error
                        NSLog(@"error = %@", error);
                    }
                    else {

                        NSError *jsonError;

                        NSArray *timeline = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&jsonError];

                        if (timeline) {

                            // at this point, we have an object that we can parse
                            NSLog(@"timeline = %@", timeline);

                            for (NSDictionary *element in timeline) {

                                NSString *listName = [element valueForKey:@"name"];
                                [listsArray addObject:listName];

                            }

                            [listsTable reloadData];

                        }

                        else {
                            // inspect the contents of jsonError
                            NSLog(@"jsonerror = %@", jsonError);
                        }

                    }
                }];

            } 
        } 
    }];

}
4

1 に答える 1

5

申し訳ありませんが、この投稿に出くわしました。まだ解決策が見つからない場合は、これが役立つことを願っています。

PerformRequestWithHandlerはどのスレッドでも呼び出すことができると思うので、UIの変更はメインスレッドにディスパッチする必要があります。

dispatch_async(dispatch_get_main_queue(), ^{
//update UI here
});

または、テーブルデータをリロードする場合は、次を使用できます。

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil    waitUntilDone:NO];
于 2013-02-01T20:21:54.453 に答える