I'm fetching datas from my api and trying to write datas to UITextview but when I try this I'm getting error.
These codes are feching datas from api and write them in 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];
}
error output :
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)
here is my 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;
It looks like you're trying to access UIKit from a background thread, which isn't recommended.
Try this: [textview performSelectorOnMainThread:@selector(setText:) withObject:[dictionary objectForKey:@"title"] waitUntilDone:YES];
This ensures that setText:
is called on the main thread.
Actually the error says, what happens. UI code must run on main thread. The following will fix the error. Put that in the completionHandler block.
dispatch_async(dispatch_get_main_queue(), ^{
//do ui operations like setting textview text
});
Try this.
Dispatch into the main thread for UI updates.
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];
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.