2011-06-06 86 views
0

我有一個UIViewController子類,它的視圖在loadView方法內以編程方式創建。該視圖的主要目的是顯示通過核心數據從商店獲取的信息。取決於從提取中接收到多少實體,視圖的創建方式會有所不同,因此我需要提前獲取這些信息。我相信到目前爲止我看到的所有教程和示例代碼都顯示了在viewDidLoad(或更高版本)中執行的提取請求,所以我只想問是否有任何理由避免在loadView中執行此操作。如果我使用loadView中的提取像viewDidLoad那樣,它會產生什麼影響嗎?謝謝。核心數據:在loadView中執行提取請求?

- (void)loadView { 
    [super loadView]; 

    NSError *error = nil; 
    if (![self.fetchedResultsController performFetch:&error]) { 
     /// 
    } 

    //...go on to load the view 
} 

回答

0

如果你正在加載數據一次ViewController的設置 - 拆卸週期,然後把它放在loadView應該沒問題。

但是,如果您有任何可能導致重新加載的按鈕或UI輸入,您可能需要在View Controller中創建自己的reloadData方法。

查看一下UITableView與Core Data的一些示例,以瞭解在Cocoa中加載核心數據對象的常用方法。 UITableView使用飛輪模式,這意味着它重用表格單元(行)對象,並隨着它的進入插入新數據。

如果您有很多CD返回的實體,請考慮使用UITableView,如果需要,可以將其設置爲與標準完全不同。

+0

視圖中沒有任何內容(按鈕/等)可以響應用戶交互,但它呈現的數據可能會在應用程序中的其他位置發生更改。我想我可以使用loadView進行初始加載,然後設置一個通知來提醒VC每當需要刷新它的數據時。 – 2011-06-06 04:22:32

0

INIT聽起來像它可能是一個很好的做法。

+0

此視圖控制器實際上是標籤欄控制器的一部分。在這種情況下,我認爲在init中進行任何類型的提取實際上是一個壞主意,因爲這會導致它們在創建時在應用程序委託中被調用。如果視圖從未真正加載,那麼這將是一個不必要的獲取。對不起,我以前應該指出這一點。 – 2011-06-06 04:19:58

0

viewDidLoad處執行提取操作很好。最重要的是調用自定義視圖對象的方法。根據你的解釋,數據獲取應該在之前完成,所以只要確保你的[super viewDidLoad]或其他超類方法在你實際獲取你的數據之前沒有做任何視圖定製。

因此,組織您viewDidLoad這樣將確保你有數據取出,並準備了看法:

- (void)viewDidLoad { 
    [super viewDidLoad] // 0: Make sure you are fully aware of what it's doing. 

    // 1: Fetch your data 

    // 2: Customize you view based on fetched data 
} 

我只用loadView,如果我不使用榫文件。 viewController類中的每種方法都有特定的目的,並且爲了您瞭解應用程序的體系結構,並最終讓其他人也瞭解它,尊重約定是非常有用的。但是,它沒有被強制執行,所以你可以做任何你想做的事情。

如果你真的想初始化你的實例變量,與其他視圖對象分開,我建議你改用- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle