2012-07-07 41 views
0

我有這樣的委託方法:managedObjectContext保存不會立即插入?

- (void)didFinishCreatingTrip:(Trip *)trip 
{ 
    NSLog(@"before"); 
    NSError* error = nil; 
    if (![self.database.managedObjectContext save:&error]) { 
     NSLog(@"%@", error); 
    } 
    NSLog(@"after"); 
} 

當調用該方法,INSERT SQL查詢不會立即發生,但約10秒後(根據控制檯日誌)。這是預期的嗎?我能做些什麼來立即發生?問題是,當我太早殺死iPhone模擬器時,數據丟失了。

登錄:

2012-07-07 23:29:41.702 tripmoney[57542:fb03] before 
2012-07-07 23:29:41.703 tripmoney[57542:fb03] after 
2012-07-07 23:29:54.948 tripmoney[57542:11407] CoreData: sql: BEGIN EXCLUSIVE 
2012-07-07 23:29:54.949 tripmoney[57542:11407] CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ? 
2012-07-07 23:29:54.950 tripmoney[57542:11407] CoreData: sql: UPDATE Z_PRIMARYKEY SET Z_MAX = ? WHERE Z_ENT = ? AND Z_MAX = ? 
2012-07-07 23:29:54.951 tripmoney[57542:11407] CoreData: sql: COMMIT 
2012-07-07 23:29:54.953 tripmoney[57542:11407] CoreData: sql: BEGIN EXCLUSIVE 
2012-07-07 23:29:54.954 tripmoney[57542:11407] CoreData: sql: INSERT INTO ZTRIP(Z_PK, Z_ENT, Z_OPT, ZNAME) VALUES(?, ?, ?, ?) 
2012-07-07 23:29:54.955 tripmoney[57542:11407] CoreData: sql: COMMIT 
2012-07-07 23:29:54.956 tripmoney[57542:11407] CoreData: sql: pragma page_count 
2012-07-07 23:29:54.957 tripmoney[57542:11407] CoreData: annotation: sql execution time: 0.0006s 
2012-07-07 23:29:54.957 tripmoney[57542:11407] CoreData: sql: pragma freelist_count 
2012-07-07 23:29:54.958 tripmoney[57542:11407] CoreData: annotation: sql execution time: 0.0006s 
+0

你肯定當你認爲它是被調用這個方法? 10秒是*瘋狂*,我也不認爲這種方法是異步的。在if塊之前和之後放入一個日誌,看看它們何時被調用。 – 2012-07-07 21:27:26

+0

用日誌編輯。它看起來非常異步。 – 2012-07-07 21:31:47

+0

確實是... – 2012-07-07 21:35:22

回答

0

CoreData作品通過保持你的一些對象的內存緩存。對於它決定保留哪些內容有點神祕,但我認爲它可能會保留最近在內存中訪問的內容,因此在下一次需要時它不必轉到磁盤。這就是內存拷貝返回正確值的原因。我瞭解您的擔憂,但在許多核心數據應用程序中,我從未被這種困擾所困擾。如果您真的擔心,請將save添加到您的applicationDidEnterBackground中,並保持活躍狀態​​。

0

當使用UIManagedDocument,只需保存:

[document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];