Ios 显示在其他线程上加载微调器
我对iOS原生开发有点陌生。我从一个API调用加载信息,加载时我想显示“加载微调器” 一切正常,但我在日志上看到以下警告: “从主线程或web线程以外的线程获取web锁。不应从辅助线程调用UIKit。” 这是我的代码:Ios 显示在其他线程上加载微调器,ios,objective-c,multithreading,grand-central-dispatch,uiactivityindicatorview,Ios,Objective C,Multithreading,Grand Central Dispatch,Uiactivityindicatorview,我对iOS原生开发有点陌生。我从一个API调用加载信息,加载时我想显示“加载微调器” 一切正常,但我在日志上看到以下警告: “从主线程或web线程以外的线程获取web锁。不应从辅助线程调用UIKit。” 这是我的代码: UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; spinne
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];
});
});
我试图切换这两个线程,但没有成功。
有什么想法吗
谢谢!
A
编辑:
我解决了这个警告。基本上,这是因为我正在访问另一个线程中的“self.searchBar.text”。为了解决这个问题,我使用了一个局部变量来存储它,然后在线程中使用这个变量。
这对我来说仍然有点困惑,但至少我没有错误或警告
感谢大家的评论/回答和帮助
A.我遇到了这个警告,这是因为我像您一样更改了块内的微调器属性 我通过将任何“微调器”调用移到块外来修复它。我刚刚创建了一个停止微调器的方法。比如:
__weak YourClass blockSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[blockSelf spinnerStop:spinner]; //REPLACED THIS LINE
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
[[blockSelf myTableView]reloadData];
[blockSelf endEditing:YES];
});
方法
-(void)spinnerStop:(UIActivityIndicatorView *)activityView {
[activityView stopAnimating];
[activityView removeFromSubView];
}
这一警告不应该太轻率,但很可能永远不会成为真正的问题。如果您关心它,您可以始终使用NSAutoReleasePool和NSThread。谢谢!我来看看。什么是self.rowsinssection?哪个电话给了你警告?您是在辅助线程上调用此方法吗?@MarcusAdams roewsInSection是我用于tableView的一个属性,用于设置行数。非常感谢,它没有解决我的警告,但这是另一个很好的方法。毕竟我还在学习。