2012-05-09 5 views
2

私のアプリケーションでUISearchBarを使用していますが、いくつかのjsonメソッドを呼び出すと問題が発生します。searchBarSearchButtonClickedは、他のメソッドがデータのロードを完了するまでキーボードを辞退していないようです。代わりに、UIAlertViewとUIButtonsを使ってsearchBarSearchButtonClicked関数を置き換えてみましたが、文字通りフリーズして「押し下げられた」状態に留まっているようです。 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;がデバイスのステータスバーにアクティビティインジケータを表示しない理由がこれに該当するかどうかも疑問に思っていました。jsonや他のデータがロードされているときに、UIButton/keyboard/UIAlertViewをビューからどのように削除しますか?

- (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

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

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! 

    }); 
}); 
+0

私はGCDについてよく知っていますが、まだアプリケーションで使用していません。私は少しスレッドを見上げる必要がありますが、私は今それを試しに行くよ! – erran

+0

よろしくお願いします!できるだけ早く学習することで、より豊かなユーザーエクスペリエンスやより高速なアプリを作成することができます。ハッピーコーディング:) –

関連する問題