2013-08-29 7 views
5

インターネットに接続してテーブルのセルをリフレッシュする機能があります。UITableView reloadDataが遅い

My機能は次のとおりです。

- (void) updateMethod 
{ 

    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
    queue.name = @"Data request queue"; 

    [queue addOperationWithBlock:^{ 

     //neither of these delay the responsiveness of the table 
     [columnArrayBackground removeAllObjects]; 
     [self getColumnDataBackground]; 

     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 

      for (int i=0; i < 6; i++) { 
       columnArray[i] = columnArrayBackground[i]; 
      }; 

      //THIS ONE LINE CAUSES DELAYS 
      [homeTable reloadData]; 


     }]; 
    }]; 
} 

すべてが[homeTable reloadData]を除き、スーパースピーディーです。私がコメントしたとき、私は素早い対応をしています。それをコメント解除すると、私のセル応答が時々遅れることがあります。

私の他のreloadData呼び出しは私のアプリケーションを遅らせることはありません。 NSOperationQueueを正しく実装していませんか?

+0

表示されているセルのみをリロードすることはできますか?ユーザーがスクロールダウンする前にデータソースが更新されている場合は、[homeTable reloadRowsAtIndexPaths:[homeTable indexPathsForVisibleRows]] – Max

+0

のように高速になります。テーブルビューの委任方法を表示します。 'getColumnDataBackground'は何をするのですか?それが「遅延」を引き起こしていることをどのように知っていますか? – Wain

答えて

6

更新メソッドからキューを削除し、テーブルを更新するものだけを残します。あなたのテーブルをリフレッシュするアクションの下に、このコードを追加します。ここで、updateMethodは、テーブルを更新するコードです。あなたがメインスレッドに戻ったときだけ、データをリロードします。お役に立てれば!

//perform on new thread to avoid the UI from freezing 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), 
       ^{ 
        //background thread code 
        [self performSelector:@selector(updatemethod:) withObject:nil]; 
        dispatch_async(dispatch_get_main_queue(), 
            ^{ //back on main thread 
             [self.tableView reloadData]; 
            });}); 
+0

このコードは、バックグラウンドスレッドとメインスレッドが同時に表示されるデータにアクセスして変更すると、競合が発生する可能性があります。 – CouchDeveloper

関連する問題