2010-02-07 101 views
10

我在我的第一個iPhone應用程序中使用核心數據,並試圖理解NSFetchedResultsController。它在我的根視圖中很好用。我是否需要在每個視圖控制器中實例化一個實例?如果是這樣,是否有一個模板可以讓它像在我的根控制器中一樣簡單(我在創建項目時只是在模板中檢查了一個框)。當我添加一個新的視圖控制器時,我看不到使用核心數據的選項。我應該在每個視圖中都有一個NSFetchedResultsController嗎?

更新:即使在將代碼剪切/粘貼到第二個視圖後,我花了一段時間才意識到,我還需要在切換到新視圖之前設置managedObjectContext。添加以下行到我的RootViewController的推導航堆棧上的新觀點之前:

self.newVC.managedObjectContext = self.managedObjectContext; 

回答

11

如果您的其他意見可視化不同的實體,那麼,你可以使用一個不同的NSFetchedResultsController。你基本上可以避免從其他視圖控制器的自動生成的根視圖控制器複製和粘貼代碼...只需更改實體名稱即可。但是,如果其他(表格)向下查看您的層次結構只顯示相同實體的不同屬性,則只需將現有對象沿層次結構向下傳遞就會更有效率/更簡單。只需在類接口中創建一個NSFetchedResultsController成員,並將其作爲視圖控制器的.h文件中的屬性公開,然後綜合該屬性並將其釋放到.m文件中。然後在將視圖控制器推入堆棧之前設置屬性。

+0

謝謝。我正在想象一個不同的實體。 XCode是否做了任何事情來簡化它,或者我真的必須爲每個視圖剪切/粘貼該代碼?我知道這不是什麼大問題,但我必須從頭文件中獲取定義,並從m文件中獲取實現。一種痛苦。 – 2010-02-08 00:00:29

+0

你真的必須剪切和粘貼每個視圖。要麼是這樣,要麼創建另一個類來抽象出與獲取的結果控制器的交互。儘管我嘗試了一次,直接處理抓取的結果控制器會更好。 – kubi 2010-02-08 00:28:20

+0

就像kubi說的那樣,根據需要可視化的不同實體的數量,在這裏抽象出一些細節可能效率也可能不高。如果是2或3,則複製並粘貼。如果它是10,也許抽象開始節省你的時間。或者,如果這些代碼將在未來得到更多的重用,那也意味着從一開始就保持清潔。在這裏務實,根據你的領域和你的要求打電話,而不是嚴格遵守DRY原則。 – 2010-02-08 01:08:55

3

我想補充一點,如果你正在使用多個NSFetchedResultsControllers同一實體,但在不同的表,您的UITableView不會,如果您使用另一個控制器同一實體插入數據更新。這是因爲你的UITableView不會從NSFetchedResultsController收到willChangeContent等消息,而你沒有將它設置爲委託。

+0

我只是被那個咬傷了。不知道分享它們是否真的值得 - 它通常很容易就做出一個新的,而不必擔心這樣的事情。 – 2012-01-31 21:09:46

+0

@亞歷克斯石頭你可以在我目前的情況下幫助我。 – Dinakar 2013-12-12 14:50:47

+0

@Alex你可以plz幫助我在我目前的情況。我有一個ViewView中的ViewController,我重新使用viewContoller在我的應用程序中的幾個模塊。我重複使用tableView但fetchController應該是一個新的實例。當我試圖實現這個應用程序崩潰 - 「內部不一致」。由於tableView包含由以前的fetchresultController填充的行,並且應該在使用fetchController的新實例加載數據之前刪除填充的行和段(核心數據中的數據應該保留並且只應刷新tableView)。你能在這種情況下幫助我嗎? – Dinakar 2013-12-12 15:00:49

相關問題