3

我建設使用RestKit和NSFetchedResultsController在我ViewControllers就像下面這個教程說明iOS應用:http://www.alexedge.co.uk/blog/2013/03/08/introduction-restkit-0-20如何更新NSFetchedResultsController?

我有一個顯示由NSFetchedResultsController獲取的數據一個UITableViewController的子類,它工作得很好。

現在我要過濾顯示的數據,所以我添加一個謂詞的NSFetchedResultsController的讀取請求,並執行再次獲取(我不使用任何緩存):

[self.fetchedResultsController.fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"title like 'some text'"]]; 
NSError *error = nil; 

[self.fetchedResultsController performFetch:&error]; 

NSAssert(!error, @"Error performing fetch request: %@", error); 

沒有錯誤發生但表格視圖未更新。我期待這種方法被稱爲

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller; 

,但它不是...

更糟的是,當我登錄獲取對象的數量這樣

NSLog(@"before refetch : %d objects", self.fetchedResultsController.fetchedObjects.count); 

[...] 

NSLog(@"after refetch : %d objects", self.fetchedResultsController.fetchedObjects.count); 

我越來越

before refetch : 18 objects 
after refetch : 0 objects 

(這可能是爲什麼我的應用程序崩潰,只要我嘗試滾動表視圖)

那麼我應該如何刷新NSFetchedResultsController的內容,以便controllerDidChangeContent被調用,從而我可以重新加載表視圖?同時又有fetchedObjects包含的東西...

編輯: 如果在這一刻我叫RestKit對象管理器以獲得在表視圖中顯示的數據與互聯網連接可用的,則NSFetchedResultsController更新,並且表視圖以及與謂詞的獲取請求的正確結果。

編輯: 我使用的謂詞是問題的原因(我認爲)。我的實體具有從字符串JSON陣列和謂語測試解析的變形屬性,如果陣列中存在搜索字符串:

[NSPredicate predicateWithFormat:@"ANY transformable_attribute like 'search string'"] 

怪異的事情是,如果我加載不謂詞的結果,並將其添加然後我得到0對象,但如果我直接用謂詞加載結果,那麼我得到3個對象。 我的謂詞錯了嗎?

編輯:是的!看起來我們不能預測可變形屬性。我不知道它爲什麼第一次運作。

回答

4

你的謂詞是導致0結果的約束。這可能是預期的行爲。檢查數據存儲中的內容,最有可能發現它遵循謂詞和數據的邏輯。

您將需要更改謂詞以獲得預期的結果。

呼叫

[self.tableView reloadData]; 

執行獲取更新表後。

+0

這是它的怪異部分。當我第一次加載結果時,我得到18個對象,然後當我添加謂詞時,我得到0對象。但是如果我第一次用謂詞加載結果,那麼我得到3個對象 – Alexis

+0

在兩種情況下,謂詞或謂詞不同。 – Mundi

4

更改NSFetchedREsultsController的謂詞不會導致controllerDidChangeContent的委託調用。從文檔:

An instance of NSFetchedResultsController uses methods in this protocol to notify 
its delegate that the controller’s fetch results have been changed due to an add, 
remove, move, or update operations. 

解決的辦法是重裝表

[tableView reloadData] 
相關問題