2013-08-29 107 views
5

我有一個連接到互聯網,然後刷新表中的單元格的功能。UITableView重載數據緩慢

我的功能是:

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