2

アプリケーションで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;

}
4

1 に答える 1

1

スレッドを使用する必要があります。インターフェイスでのすべての操作はメインスレッドで行われるため、メインスレッドで長いタスクを実行すると、タスクが完了する前にインターフェイスがそれ自体を更新することはできません。

UIViewControllerでは、[self PerformSelectorInBackground:@selector(grabData)withObject:self]を実行できます。これは、グランドセントラルディスパッチを使用して新しいキュー(スレッド)をディスパッチするための便利なメソッドです。

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!

    });
});
于 2012-05-09T00:44:40.107 に答える