1

我的实体类别中有一个简单的方法,可以将自定义方法添加到我的子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,滑动删除,确认,它说'删除按下'。从上下文中删除对象,保存它(但显然不是在这里),然后说删除成功(所以没有错误),然后我点击主页按钮,它记录了最后一个“保存”行,它最终保存到持久存储中。那么为什么中间的人不储蓄呢?

4

1 回答 1

0

轻松修复,我现在总是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];
}

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

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

我的日志现在干净多了。这是执行删除。我调用列出所有项目的 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.
于 2013-05-30T12:32:23.440 回答