2011-11-17 9 views
5

iOS5で追加された新しいsendAsynchronousRequestを使用しようとしています。 モデルクラス(File)には、サーバーからデータを要求し、このデータをモデルオブジェクトを作成したコントローラクラス(FilesController)に渡すメソッドがあります。 NSLogsに示す方法sendAsynchronousRequest with tableView描画時のリロードデータの遅延

[File findAll:conditions completionHandler:^(NSArray *files) { 
    dataSource = files; 

    NSLog(@"set"); 

    [self.tableView reloadData]; 

    NSLog(@"reload"); 

    activityIndicator.hidden = TRUE; 
}]; 

コンソールで私はすぐに見ることができる:

[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    NSArray *decodedResponse = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; 
    NSArray *files = [self _dictionariesToFiles:decodedResponse]; 
    handler(files); 
}]; 

コントローラクラスは、このようにそれを使用する:

モデルクラスは、次のコードと方法を有します"set"と "reload"メッセージが表示されますが、テーブルとインジケータは数秒(5-10秒)経過するまで変化しません。

誰かがどこに問題があるか知っていますか?

ありがとうございました。

PD:非同期要求を互換性のある同期されたもので変更しましたが、問題が解消されましたが、このために非同期要求を使用します。

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSArray *decodedResponse = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil]; 
NSArray *files = [self _dictionariesToFiles:decodedResponse]; 
handler(files); 

答えて

16

あなたがメインスレッドで[tableView reloadData]を実行する必要があります。

これは、互換性のある同期コードです。すべてのUI操作はメインスレッドで行う必要があります。これを行うための複数の方法。一つは次のとおりです。

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.tableView reloadData]; 
    activityIndicator.hidden = TRUE; 
}); 

EDIT:[[NSOperationQueue alloc] init]が、[NSOperationQueue mainQueue]すべてのものを使用することが最適です:私はいくつかの問題使用を持っていた例

3

にactivityIndi​​catorを追加しました。新しいキューを使用すると、実行行は自然順序に従いません

+2

mainQueueはメインスレッドで実行されるためです。これはすべてのUIの処理が行われる場所です。 – greenisus

+0

@Rscorreia greenisusは正しい私がこれを発見するまで私はあなたと同じ問題を抱えていた。 –

+0

@greenisusそれでは、どのようにして迅速に動作するように非同期リクエストをどうやって取得しますか? '' '[' 'NSOperationQueue mainQueue]' 'を実行すると、最初に非同期要求を使用する目的を破るメインスレッドに置かれます。 – Supertecnoboff

関連する問題