如何在加载 json 或其他数据时从视图中删除 UIButton/键盘/UIAlertView



我在我的应用程序中使用了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!
    });
});

最新更新