我对 iOS 原生开发有点陌生。我正在从 API 调用加载信息,并且在加载时我想显示“加载微调器”。
一切正常,但我在日志中收到此警告:“从主线程或 Web 线程以外的线程获取 Web 锁。不应从辅助线程调用 UIKit。”
这是我的代码:
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
spinner.center = CGPointMake(160, 150);
spinner.hidesWhenStopped = YES;
[self.view addSubview:spinner];
[spinner startAnimating];
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
dispatch_queue_t downloadQueue = dispatch_queue_create("downloader", NULL);
dispatch_async(downloadQueue, ^{
NSString *url = [NSString stringWithFormat:@"https://www.***********?q=%@",[self.searchBar.text urlEncode:NSUTF8StringEncoding]];
NSURL *googleURL = [NSURL URLWithString:url];
NSData *jsonData = [NSData dataWithContentsOfURL:googleURL];
NSError *error = nil;
NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
for (NSDictionary *items in [dataDict objectForKey:@"items"]) {
Book *book = [Book bookWithTitle:[[items objectForKey:@"volumeInfo"] objectForKey:@"title"]];
book.authors = [[[items objectForKey:@"volumeInfo"] objectForKey:@"authors"] objectAtIndex:(0)];
[self.rowsInSection addObject:book];
}
dispatch_async(dispatch_get_main_queue(), ^{
[spinner stopAnimating];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
[[self myTableView]reloadData];
[self.view endEditing:YES];
});
});
我试图切换两个线程,但没有奏效。任何想法?
谢谢!一个。
编辑:
我解决了警告。基本上它正在发生,因为我正在访问另一个线程内的“self.searchBar.text”。为了解决这个问题,我使用了一个局部变量来存储它,然后在线程中使用该变量。对我来说仍然有点困惑,但至少我没有错误或警告。
感谢大家的评论/答案和帮助!
一个。