我在我的应用程序中使用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;
}
答案 0 :(得分:1)
您必须使用线程。使用您的接口进行的所有操作都发生在主线程上,因此当您在主线程上执行冗长的任务时,接口将无法在任务完成之前自行更新。
在UIViewController中,您可以使用Object:self]执行[self performSelectorInBackground:@selector(grabData),这是一种使用宏中心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!
});
});