为什么Core Data需要这么长时间来保存一个对象?

我在我的实体类中有一个简单的方法,将自定义方法添加到我的子类NSManagedObject类(由于自动生成子类,我不会触及)。

我有这种方法从MOC中删除一个对象,并保存上下文。

 + (void)deleteWishlist:(Wishlist *)wishlist inManagedObjectContext:(NSManagedObjectContext *)context { [context deleteObject:wishlist]; NSError *error; if(![context save:&error]) { NSLog(@"%@", error); } else { NSLog(@"Delete successful"); } } 

我从我的一个视图控制器调用这个:

 - (void)deleteWishlist:(Wishlist *)wishlist { if(wishlist) { [Wishlist deleteWishlist:wishlist inManagedObjectContext:self.managedObjectContext]; } } 

它从UI事件处理方法(委托tableView: commitEditingStyle: forRowAtIndexPath:方法)被调用。

现在,这一切工作,但它需要很长时间来保存对象…我不知道这是否是默认行为,但我希望它从图中删除后立即保存到永久存储。 我不介意是否必须等到保存。

在iOS模拟器上,如果我点击“停止”,然后再次加载我的应用程序,愿望清单仍然存在。 如果我点击主页button,应用程序进入后台模式,并在那里得到保存…但它似乎是保存两次。 老实说,我不知道第一次做什么。

 2013-05-29 00:45:14.819 App[29024:c07] [WishlistCDTVC setFetchedResultsController:] set 2013-05-29 00:45:14.820 App[29024:c07] [WishlistCDTVC performFetch] fetching all Wishlist (ie, no predicate) 2013-05-29 00:45:15.755 App[29024:c07] Delete pressed 2013-05-29 00:45:16.666 App[29024:c07] NSManagedObjects did change. 2013-05-29 00:45:16.669 App[29024:c07] NSManagedContext did save. 2013-05-29 00:45:16.670 App[29024:c07] Delete successful 2013-05-29 00:45:19.119 App[29024:c07] NSManagedContext did save. 

我做了什么:加载愿望清单VC,刷卡删除,确认,它说'删除按下'。 从上下文中删除对象,保存它( 但显然不在这里 ),然后说删除成功(所以没有错误),然后我点击主页button,它logging最后一个“保存”行,最后保存到永久存储。 那么,为什么中间人不能节约呢?

简单的修复,我现在总是保存NSManagedDocument后上下文的任何更改(我不需要撤消function)。

在我的共享文档处理程序类中,我告诉它保存更改通知。

 - (void)objectsDidChange:(NSNotification *)notification { #ifdef DEBUG NSLog(@"NSManagedObjects did change."); #endif [BSDocumentHandler saveDocument]; } 

saveDocument只是一个类的方法:

 + (void)saveDocument { UIManagedDocument *document = [[BSDocumentHandler sharedDocumentHandler] document]; [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:nil]; } 

现在它立即保存,当我停止模拟器使用停止时,它现在保存保存。

此外,为了避免重复保存,我现在在创build,编辑或删除一个对象后,删除了包含托pipe对象上下文保存的所有行,而且我的共享文档处理程序类自动pipe理所有保存,从而使重复代码less得多。

我的日志现在更干净了。 这是执行删除。 我调用VC列出所有项目,滑动删除,并确认。 它注意到MOC发生了变化,并保存了一次文档(如预期的那样)。

 2013-05-30 13:33:01.310 App[27167:c07] [ItemCDTVC setFetchedResultsController:] set 2013-05-30 13:33:01.312 App[27167:c07] [ItemCDTVC performFetch] fetching all Item (ie, no predicate) 2013-05-30 13:33:04.735 App[27167:c07] NSManagedObjects did change. 2013-05-30 13:33:04.751 App[27167:c07] NSManagedContext did save.