我正在尝试在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);
}
}];
}
self
是UITableViewController
的子类。
由于阻止,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线程以外的线程。这可能 是从辅助线程调用UIKit的结果。崩溃 现在...
如何解决此问题?
...谢谢
答案 0 :(得分: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];
});
答案 1 :(得分:0)
插入此内容,可能会有所帮助:
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
答案 2 :(得分:0)
解决了:
以下代码也适用:
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self.tableView reloadData];
}];
答案 3 :(得分:0)
尝试:
[self.tableView performSelectorInMainThread:@selector(reloadData)];
而不是:
[self.tableView reloadData];