2010-01-16 74 views
7

我完成了將我的應用程序轉換爲使用CoreData層以用於我想要使用的小型數據庫的需求。我對性能以及如何最好地使用它有一些擔憂。特別是: 我有很多運行,我從文件中的磁盤屬性讀取:每個屬性應該生成一個新的對象,除非該類型的對象和該值已經存在。因此,對於我讀取的每個文件,我都:執行一次提取以檢查該託管對象是否已經存在;如果完成,否則我創建對象,賦值並保存上下文。關於上下文保存的核心數據性能

目前,我每次創建一個新對象時都會保存一次上下文,因此每次讀取文件(可以是數百個)發生的次數大概是十次(對於十個屬性)。最好是減少上下文保存點,也許一次是文件而不是一次屬性?我不知道這個操作的開銷,所以我不知道是否可以經常這樣做,或者如何找出花在這個上的時間(可能是用這些樂器?不知道怎麼做)。

回答

11

設置每個屬性後沒有任何需要保存。

通常情況下,只有當代碼完成後才能保存託管對象,因爲保存會重置撤銷。在您描述的設置中,您可以在將其保存到永久存儲區之前安全地生成數百個託管對象。您可以在內存中擁有大量(數千個)輕量級(文本屬性)對象,而不會對iPhone造成任何負擔。

iPhone上唯一的問題是,你永遠不知道什麼時候該應用程序將被暫停或關閉。這使得節省比其他平臺更常見。但是,不在你現在使用的範圍內。

Core Data Performance section的指南可能會幫助您計劃。儀器允許您查看核心數據性能的詳細信息。

但是,除非您使用大量數據測試應用程序並發現速度緩慢,否則我什麼也不做。過早優化是萬惡之源。不要浪費時間來防止你可能沒有的問題。

+0

是的,關於突然停止/暫停的觀點正是我所擔心的。無論如何,我會同意每個文件最多保存一次就足夠了,將所有屬性分組在單個「運行」中。感謝您也指向性能部分的指針。 – Andy 2010-01-18 12:35:57

+0

當前核心數據性能鏈接:https://developer.apple.com/library/prerelease/watchos/documentation/Cocoa/Conceptual/CoreData/Performance.html – jQwierdy 2015-10-19 21:13:19

3

爲了防止「突然施加停止」的問題,您可以實現類似的東西的方法:

- (void)saveContext { 

NSError *error = nil; 
NSManagedObjectContext *managedObjectContext = self.managedObjectContext; 


if (managedObjectContext != nil) { 
    if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { 
     /* 
     Replace this implementation with code to handle the error appropriately. 

     abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button. 
     */ 
     LogError(@"Unresolved error %@, %@", error, [error userInfo]); 
      // abort(); 
    } 
} 

}

,並用它內部的應用程序委託的方法有兩種:

- (void)applicationWillTerminate:(UIApplication *)application; 

- (void)applicationDidEnterBackground:(UIApplication *)application; 

認爲它可能不是100%的解決方案,但在大多數情況下,它將完成這項工作......