2010-09-22 109 views

回答

34

你可以在模型中使用的「現在」,但核心數據的計算結果,在編譯時,不是運行。你會得到存儲在你的模型默認編譯的日期,這可能不是你想要的東西:

http://iphonedevelopment.blogspot.com/2009/07/core-data-default-dates-in-data-model.html

最可靠的方法,以確保當前日期的默認屬性值是覆蓋在-awakeFromInsert一個NSManagedObject子類並在那裏分配當前日期。

- (void) awakeFromInsert 
{ 
    [super awakeFromInsert]; 
    self.date = [NSDate date]; 
    // or [self setPrimitiveDate:[NSDate date]]; 
    // to avoid triggering KVO notifications 

} 

注意:如果你正在做使用嵌套的管理對象上下文(或UIManagedDocument)的,上面會不會達到預期效果。此建議僅適用於使用單個託管對象上下文的情況。

+2

這是不對的,因爲每次創建NSManagedObject時都會調用awakeForInsert。不同的NSManagedObject可以在不同的線程中創建,而它們表示相同的CoreData實體。 – Kamchatka 2013-06-13 07:48:32

+0

在代表同一個實體的兩個不同線程中創建一個託管對象將違反核心數據物理定律。肯定是一些應用程序邏輯錯誤的指標。做這樣的事情不是推薦的做法。 – 2013-06-16 00:56:52

+0

我相信你可以。這是一個公平的用例:你可以在主線程上顯示一個Core Data對象來顯示(比如說一個「Photo」對象),然後在後臺有一個工作線程從數據庫加載同一個對象,應用一些圖像處理,將照片保存回持久存儲。此時,您將獲得全局更改通知,並且主線程可以決定將更改合併到主線程託管對象上下文中。 – Kamchatka 2013-06-17 08:48:07