2012-10-23 70 views
0

我迭代通過文本的陣列,隨着每次迭代我:如何在不使用insertRowsAtIndexPaths的情況下加載fetchResultsController?

  • 創建使用initWithEntity管理對象:insertIntoManagedObjectContext
  • 解析文本
  • 確定顯示順序

隨着新創建的對象以tableview結尾。

因爲fetchResultsController的超爽免費功能,如insertIntoManagedObjectContext被稱爲細胞得到自動插入的tableview。

的問題是存在在處理每個新對象(〜20毫秒)有輕微的延遲和文本的行的順序比正在更新的tableview中被不同地排序。這會導致屏幕閃爍,因爲所有的單元格都顯示出它們的顯示順序,而其他單元格快速插入它們後面。 (如果不清楚,我可以發佈這種效果的視頻,但我不認爲這很難描述它。)

採用文本行並首先將它們解析爲另一個數組是合乎邏輯的,然後插入陣列到商務部,但我不能因爲這些管理對象,我不能只是ALLOC他們 - 我要打電話initWithEntity:insertIntoManagedObjectContext,這反過來會自動將細胞進入的tableview。

取出insertRowsAtIndexPaths:withRowAnimation在didChangeObject方法,只是調用reloadData當迭代結束沒有工作。 (應該吧?)

我只是想表不更新已創建的所有對象後,直到。 我看不出用fetchResultsController做到這一點的方法,即使它沒有一個也是微不足道的。由於經常出現我在SO-上的問題,我在這裏丟失了什麼

回答

0

要停止更新表視圖,你只需要獲取的成果控制器委託設置爲nil

self.controller.delegate = nil; 

要繼續更新,重新設置委託,執行初始抓取,並重新加載表中的數據:

self.controller.delegate = self; 
BOOL success = [controller performFetch:&error]; 
[self.tableView reloadData]; 

performFetch是必要的,因爲所取出的結果控制器不跟蹤對被管理對象的上下文而它沒有委託。


或者,你也可以在後臺線程中添加數據,使用第二管理對象上下文和保存,只有當所有數據導入這方面。

主線程可以註冊後臺線程的NSManagedObjectContextDidSaveNotification,並調用mergeChangesFromContextDidSaveNotification:刷新對象。

在這種情況下,對讀取的結果控制器沒有變化是必要的。

+0

將fetchController設置爲nil很好。如果不是那樣的話,我會在我的第一個Hello World應用程序中... –

相關問題