我开发了一个连接到 Twitter 并获取信息的小型应用程序。我想在前端向用户显示这些信息。问题在于,由于 Twitter API 使用线程,当我尝试与 GUI 交互时,出现以下错误:
试图从主线程或网络线程以外的线程获取网络锁。这可能是从辅助线程调用 UIKit 的结果。
我的问题是,我如何才能在主线程中知道何时收到 Twitter 的响应,以便我能够将其显示给用户?
代码是这样的,它在一个函数中:
NSString * url = [[NSString alloc] initWithFormat:@"http://search.twitter.com/search.json?q=%@", query];
TWRequest * request = [[TWRequest alloc] initWithURL:[NSURL URLWithString:url] parameters:nil
requestMethod:TWRequestMethodGET];
[request performRequestWithHandler:^(NSData * responseData, NSHTTPURLResponse * urlResponse, NSError * error)
{
if ([urlResponse statusCode] == 200)
{
// format response and show to user
// show to user
}
else
{
NSLog(@"Twitter error, HTTP response: %i", [urlResponse statusCode]);
}
}];
如果我尝试通过此函数修改 GUI,则会出现错误。
谢谢
最佳答案
从后台线程更改 UI 是绝对不允许的。在这种情况下,您应该在 TWRequest 响应 block 中调用 [self performSelectorOnMainThread:withObject:waitUntilDone:]。见下文
例子...
- (void)makeRequest {
NSString * url = [[NSString alloc] initWithFormat:@"http://search.twitter.com/search.json?q=%@", query];
TWRequest * request = [[TWRequest alloc] initWithURL:[NSURL URLWithString:url] parameters:nil
requestMethod:TWRequestMethodGET];
// make the request..
[request performRequestWithHandler:^(NSData * responseData, NSHTTPURLResponse * urlResponse, NSError * error)
{
if ([urlResponse statusCode] == 200)
{
[self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO]
}
else
{
NSLog(@"Twitter error, HTTP response: %i", [urlResponse statusCode]);
}
}];
}
- (void)updateUI {
// here you can now update your UI safely
}
关于iOS 5 推特 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8110060/