【问题标题】:Why does Core Data take so long to save an object?为什么 Core Data 需要这么长时间来保存一个对象?
【发布时间】:2013-05-24 02:09:20
【问题描述】:

我的实体类别中有一个简单的方法,该方法将自定义方法添加到我的子类 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 模拟器上,如果我点击“停止”然后再次加载我的应用程序,愿望清单仍然存在。如果我点击主页按钮,应用程序会进入后台模式,并在那里保存......但它似乎保存了两次。老实说,我不知道它第一次在做什么。

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 (i.e., 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,滑动删除,确认,它说“删除已按下”。从上下文中删除对象,保存它(但显然不在这里),然后说删除成功(所以没有错误),然后我点击主页按钮,它记录了最后一个“保存”行,确实如此最后保存到持久存储。那么为什么中间那个不省钱呢?

【问题讨论】:

  • @MikePollard 我正在使用相同的共享上下文。
  • 你的模型怎么样?你有多少个愿望清单?愿望清单是否与其他实体相关联?如果是,您是否设置了级联规则?

标签: ios objective-c core-data nsmanagedobjectcontext save


【解决方案1】:

轻松修复,我现在总是在对上下文进行任何更改后保存NSManagedDocument(我不需要撤消功能)。

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

- (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];
}

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

此外,为了避免重复保存,我现在在创建、编辑或删除对象后删除了所有包含托管对象上下文保存的行,并且我的共享文档处理程序类会自动管理所有保存,从而减少重复代码。

我的日志现在干净多了。这是执行删除。我调用列出所有项目的 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 (i.e., 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2011-12-07
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多