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

时间:2012-05-09 00:35:13

标签: iphone json ios5 uisearchbar

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

}

1 个答案:

答案 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!

    });
});