0

でツイートを表示しようとしていますUITableView

コード:-

- (void)requestTimeline:(int)count
{    
    NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1/statuses/user_timeline.json"];

    NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
    [parameters setObject:@"abc" forKey:@"screen_name"];
    [parameters setObject:@"20" forKey:@"count"];
    [parameters setObject:@"1" forKey:@"include_entities"];

    TWRequest *request = [[TWRequest alloc] initWithURL:url parameters:parameters requestMethod:TWRequestMethodGET];

    [request performRequestWithHandler:^(NSData *responseData1, NSHTTPURLResponse *urlResponse, NSError *error)
    {
        if (responseData1 != nil)
        {
            NSError *error = nil;
            self.itemsToDisplay = [NSJSONSerialization JSONObjectWithData:responseData1 options:NSJSONReadingMutableLeaves error:&error];

            if (self.itemsToDisplay != nil)
            {
                [self.tableView reloadData];
            }
            else
            {
                NSLog(@"Error serializing response data %@ with user info %@.", error, error.userInfo);
            }
        }
        else
        {
            NSLog(@"Error requesting timeline %@ with user info %@.", error, error.userInfo);
        }
    }];
}

selfUITableViewControllerサブクラスです。

ブロックのため、Twitterリクエストはメインスレッドではなく別のスレッドで実行されます。それがクラッシュする理由です。

//TWRequest.h

// Issue the request. This block is not guaranteed to be called on any particular thread.
- (void)performRequestWithHandler:(TWRequestHandler)handler;

クラッシュレオルト:-

bool _WebTryThreadLock(bool)、0xa8e4f50:メインスレッドまたはWebスレッド以外のスレッドからWebロックを取得しようとしました。これは、セカンダリスレッドからUIKitを呼び出した結果である可能性があります。今クラッシュしています...

この問題をどのように解決しますか?

ありがとう...

4

4 に答える 4

12

Web ビューは、メイン スレッドからのみ使用する必要があります。UIKit の多く -- tableView reloadData コマンドもスレッドセーフではありません

dispatch_async(dispatch_get_main_queue(), ^{ 
    //all you ever do with UIKit.. in your case the reloadData call
    [self.tableView reloadData];
});
于 2013-01-03T10:42:37.807 に答える
0

解決済み:

以下のコードも機能します:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                [self.tableView reloadData];
                            }];
于 2013-01-03T10:48:21.577 に答える
0

これを挿入してください。

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
于 2013-01-03T10:28:30.123 に答える
0

試す:

[self.tableView performSelectorInMainThread:@selector(reloadData)];

それ以外の:

[self.tableView reloadData];
于 2013-01-03T11:01:14.610 に答える