我从我的api中获取数据并尝试将数据写入UITextview但是当我尝试这个时我收到了错误。
这些代码从api获取数据并在uitextview中写入:
NSOperationQueue *apiCallsQueue = [[NSOperationQueue alloc] init];
NSString *urlstring=@"x.com/api.php?id=";
urlstring =[urlstring stringByAppendingString:self.newsId];
NSURL *newsdetail = [NSURL URLWithString:urlstring];
newsdetailrequest = [NSURLRequest requestWithURL:newsdetail];
@try
{
[NSURLConnection sendAsynchronousRequest:newsdetailrequest queue:apiCallsQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:nil error:nil];
[textview setText:[dictionary objectForKey:@"title"]];
}];
}
@catch (NSException *exception)
{
UIAlertView *errorView = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Error"
delegate:nil
cancelButtonTitle:@"Tamam"
otherButtonTitles:nil];
[errorView show];
}
错误输出:
2013-06-18 16:37:16.214 xpro[6816:5103] bool _WebTryThreadLock(bool), 0x7142ee0: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now...
1 0x3571fe9 WebThreadLock
2 0x15846e -[UITextView setText:]
3 0x5f00 __39-[NewsDetailViewController viewDidLoad]_block_invoke
4 0xbdbcf8 __block_global_0
5 0xb4375a -[NSBlockOperation main]
6 0xb11453 -[__NSOperationInternal start]
7 0xb11164 -[NSOperation start]
8 0xb9da31 __block_global_6
9 0x49ff53f _dispatch_call_block_and_release
10 0x4a11014 _dispatch_client_callout
11 0x4a022e8 _dispatch_root_queue_drain
12 0x4a02450 _dispatch_worker_thread2
13 0x96c53e72 _pthread_wqthread
14 0x96c3bd2a start_wqthread
(lldb)
这是我的Controller.h
@interface NewsDetailViewController : UIViewController
{
NSURLRequest *newsdetailrequest;
NSMutableData *newsdetailData;
}
@property (weak, nonatomic) IBOutlet UINavigationBar *newsdetailTitle;
@property (weak, nonatomic) IBOutlet NSString *navBarTitle;
@property (weak, nonatomic) IBOutlet NSString *newsId;
@property (weak, nonatomic) IBOutlet UITextView *htmlDetail;
答案 0 :(得分:1)
看起来你正试图从后台线程访问UIKit,这是不推荐的。
试试这个:[textview performSelectorOnMainThread:@selector(setText:) withObject:[dictionary objectForKey:@"title"] waitUntilDone:YES];
这可确保在主线程上调用setText:
。
答案 1 :(得分:1)
实际上错误说,会发生什么。 UI代码必须在主线程上运行。以下将修复错误。把它放在completionHandler块中。
dispatch_async(dispatch_get_main_queue(), ^{
//do ui operations like setting textview text
});
答案 2 :(得分:1)
试试这个。
调度主线程以进行UI更新。
NSOperationQueue *apiCallsQueue = [[NSOperationQueue alloc] init];
NSString *urlstring=@"x.com/api.php?id=";
urlstring =[urlstring stringByAppendingString:self.newsId];
NSURL *newsdetail = [NSURL URLWithString:urlstring];
newsdetailrequest = [NSURLRequest requestWithURL:newsdetail];
@try
{
[NSURLConnection sendAsynchronousRequest:newsdetailrequest queue:apiCallsQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:nil error:nil];
dispatch_async(dispatch_get_main_queue(),
^{
[textview setText:[dictionary objectForKey:@"title"]];
});
}];
}
@catch (NSException *exception)
{
UIAlertView *errorView = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Error"
delegate:nil
cancelButtonTitle:@"Tamam"
otherButtonTitles:nil];
[errorView show];
}