2013-10-02 39 views
0

我首次創建了核心數據應用程序。它運行良好。我使用Web服務(使用AFNetworking)創建了所有帶有數據的對象。我的物體都已建成。 所以,現在我想知道什麼是預加載數據的最佳方式。 (Web服務>核心數據>我的看法) 暫時,這很簡單,但絕對沒有人性,這是這樣的:如何使用核心數據預加載數據

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [ManagedMember loadDataFromWebService]; 
    [ManagedLesson loadDataFromWebService]; 
    [ManagedThematic loadDataFromWebService]; 
    [ManagedNew loadDataFromWebService]; 
    [ManagedProject loadDataFromWebService]; 

    return YES; 
} 

loadDataFromWebService是調用連續兩個函數的函數。 (刪除核心數據對象中的所有數據並重新創建運行良好的對象) 所以,我想知道我可以在哪裏調用這5個函數?像許多iOS應用程序一樣,在啓動屏幕中是否可以裝載加載程序?或者創建一個加載數據的中間視圖。
非常感謝。

+0

您不能在「didFinishLaunchingWithOptions」方法中預加載數據,我認爲您應該將該代碼放在rootviewcontroller的「viewDidLoad」方法中。 –

+0

是的,我試過了,但是每次進入視圖時都會重新加載數據。 – Benjamin

+0

你可以在viewDidLoad(或其他方法)中做到這一點,但你會想設置一個標誌,所以它不會嘗試再次加載數據。如果這個數據只在第一次加載時加載一次,請在NSUserDefaults中設置一個標誌。否則,如果在每次打開應用程序時調用一次,只需設置一個BOOL並檢查它以確保它不再被調用。 – Ryan

回答

0

千萬不要永遠不要在didFinishLaunchingWithOptions:中加載這樣的數據。這種方法應該儘可能最小化,然後儘快返回。把緩慢的東西放在那裏可能會導致糟糕的用戶體驗,如果iOS沒有足夠快地退出該功能,iOS可以強制關閉你的應用程序。

正如D-eptdeveloper建議的,viewDidLoad是觸發加載代碼的更好的地方,但它仍然不是很好。理想情況下,您可以在應用程序的早期階段觸發數據加載,並且各個視圖控制器只是根據需要請求數據(瞭解數據可能尚未提供,因此可能需要顯示某種進度指示器)。

觸發數據加載的合適位置/時間是在向用戶顯示初始UI之後。這減少了潛在的問題,因此在較早的時間觸發數據加載實際上減慢了UI的外觀(不是一個好的用戶體驗)。

+1

此外,啓動時間過長可能會導致您的應用程序在Xcode中的上傳過程中被拒絕,而'Watchdog timer'的消息類似於「您的應用程序啓動時需要花費太多時間」。這是第一次檢查完成整個審查過程的第一部分。 – Leonardo

+0

那麼我怎麼才能在應用程序的早期開始加載數據呢?那是我的問題。但是,'viewDidLoad'是一個解決方案。 @occulus – Benjamin

+0

@Benjamin對我的回答添加了評論。 – occulus

0

觸發AppDelegate中的同步(在applicationDidBecomeActive:方法中)是可以的,因爲它是您的代碼執行的第一個地方。只要確保你在後臺線程中進行所有同步。

該主題相當一般,但您可以在線找到有關同步策略的很好示例,例如, How To Synchronize Core Data with a Web Service – Part 1