我在我的应用程序中使用了UISearchBar,问题是当我调用几个json方法时searchBarSearchButtonClicked
这些方法似乎在其他方法完成加载数据之前不会退出键盘。我尝试过使用 UIAlertView 和 UIButtons 来替换searchBarSearchButtonClicked
功能,但它们似乎也冻结并处于"按下"状态。我还想知道这是否是[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
不会在设备的状态栏中显示活动指示器的原因。
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
self.args = searchBar.text;
[self grabData];
[self fillVars];
[searchBar resignFirstResponder];
[self.tableView reloadData];
}
[self grabData]
是我获取 JSON 数据的地方,[self fillVars]
只是填充了一些稍后使用的东西。
-(void)grabData{
self.args = [self.args stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
urlString = [NSString stringWithFormat:@"%@%@?key=%@&q=%@",baseUrl,func,apiKey,args];
url = [NSURL URLWithString:urlString];
NSData *jsonData = [NSData dataWithContentsOfURL:url];
NSError *error;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];
self.matches = [json objectForKey:@"matches"];
[UIApplication sharedApplication].networkActivityIndicatorVisible=YES;
}
您必须使用线程。对接口的所有操作都发生在主线程上,因此当您在主线程上执行冗长的任务时,接口将无法在任务完成之前自行更新。
在UIViewController中,你可以做[self performSelectorInBackground:@selector(grabData) withObject:self],这是一种使用grand central dispact调度新队列(线程)的便捷方法。
您也可以使用 GCD API 手动执行此操作。你会做一些类似的事情:
dispatch_queue_t jsonQueue = dispatch_queue_create("JSON Queue", NULL);
dispatch_async(jsonQueue, ^{
// fetch JSON data ...
dispatch_async(dispatch_get_main_queue(), ^{
// perhaps do something back on the main queue once you're done!
});
});