2015-05-06 26 views
1

在我的應用程序中,UITableview中的每個單元都需要從API中獲取數據。爲了使應用程序看起來更快,我一次獲取一個單元格的數據並使用[tableview reloadData]進行顯示。但是在做這件事時,ViewController本身沒有響應。我不能點擊後退按鈕或點擊一個單元格(致電didSelectRowAtIndexPath)。有沒有解決方案? 我打電話的reloadData方法這樣正在執行[tableview reloadData]時交互不起作用

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 
     dispatch_async(queue, ^{ 
      [tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 
     }); 
+0

嘗試'dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(的int64_t)(1 * NSEC_PER_SEC)),dispatch_get_main_queue(),^ { [的tableView reloadData];} );' – iphonic

+0

這幾乎工作。現在我可以得到後退按鈕來回應。但一旦它達到前一個視圖控制器,應用程序崩潰。你能想到可能發生的任何原因嗎? –

+0

我想看看那個崩潰日誌,它可能是由別的東西引起的,而不是你正在想的。 – iphonic

回答

4

刷新了的tableView的主線程:

dispatch_async(queue, ^{ 

// Perform background task. Call webservice etc 

       dispatch_async(dispatch_get_main_queue(),^
      { 
       // Perform UI related tasks 
       [tableView reloadData]; 
      } 

     }); 
0

您目前在後面進行塊,呼籲在主線程中執行的方法......這是多餘的,你應該簡單地調用[tableView reloadData]。 如果調用reloadData需要很多時間來凍結你的UI(表的重新加載必須發生在主UI線程上,並且不能在後面執行),那麼你可能會做錯了什麼。

如果在任何表視圖委託或數據源方法中有任何網絡調用都是同步完成的,那麼您應該在後面以異步方式執行它們,然後只在請求完成時重新加載表。

0

這是因爲你只是阻止主線程。
你說你添加一個單元格時間,我猜想單元格內容是從一個Web服務返回的。這不是處理這樣的問題的最合適的方式,也是因爲您可能會打開大量連接來下載需要填充表格視圖的數據。
-reloadData只有當您需要更新表格視圖的所有內容時才能使用,如果您想在時間添加單元格,則應使用-insertRowsAtIndexPaths:withAnimation:包裝在-beginUpdates-endUpdates之內。

0
int requiredNumberOfCells = 10; 
int currentNumberOfCells = 0; 
[tableView reloadData]; 
dispatch_queue_t tableviewcell = dispatch_queue_create("tableviewcell", NULL); 
dispatch_async(tableviewcell, ^{ 

for (int i = 1;i<=requiredNumberOfCells;i++){ 
//Fetch details for each cell here 
currentNumberOfCells = i; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [tableView reloadData]; 
    }); 
} 
}); 
相關問題