在 UIManagedDocument 中禁用自动保存

Posted

技术标签:

【中文标题】在 UIManagedDocument 中禁用自动保存【英文标题】:Disable auto-saving in UIManagedDocument 【发布时间】:2013-11-12 21:15:14 【问题描述】:

有没有办法禁用 UIManagedDocument 的自动保存?

我在控制器中显示NSManagedObjects,用户可以在其中添加和删除它们。但是我只想在用户明确触发保存操作时保存这些更改。否则我想放弃更改。

感谢您的帮助!

【问题讨论】:

如果您的应用程序崩溃/被杀死并且用户没有更改按保存按钮会发生什么? 这是一个很好的观点。对于我的情况,虽然恢复到以前的状态是件好事。谢谢你的评论! 【参考方案1】:

你不能在UIManagedDocument子类中重写下面的方法

- (void)autosaveWithCompletionHandler:(void (^)(BOOL success))completionHandler

编辑:这里有一些您可能想要包含的其他方法。我使用第一个来确认是否以及何时发生自动保存,第二个用于调试某些错误,无法通过任何其他方式获得其详细信息。这就是我的子类中的所有内容,因此添加它非常简单。

@implementation YourManagedDocument


- (id)contentsForType:(NSString *)typeName error:(NSError *__autoreleasing *)outError

    NSLog(@"Auto-Saving Document");
    return [super contentsForType:typeName error:outError];


- (void)handleError:(NSError *)error userInteractionPermitted:(BOOL)userInteractionPermitted

    NSLog(@" error: %@", error.localizedDescription);
    NSArray* errors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
    if(errors != nil && errors.count > 0) 
        for (NSError *error in errors) 
            NSLog(@" Error: %@", error.userInfo);
        
     else 
        NSLog(@" error.userInfo = %@", error.userInfo);
    

@end

【讨论】:

是的,在我看来,这就是我最终要做的事情,并在控制器中传递一个我想禁用自动保存的标志。我希望能找到一些避免子类化的解决方案。还是谢谢!【参考方案2】:

有关详细信息,请参阅 this SO answer,但除非您明确保存您的 NSManagedObjectContext,否则您可以调用 [managedObjectContext rollback] 撤消用户所做的任何更改。

【讨论】:

这似乎是正确的方法。但是,它如何知道放弃更改的时间点?自动保存以不可预知的方式发生。感谢您的回复!

以上是关于在 UIManagedDocument 中禁用自动保存的主要内容,如果未能解决你的问题,请参考以下文章

使用 saveToURL:forSaveOperation:completionHandler 自动删除 UIManagedDocument 文件:

UIManagedDocument - 验证核心数据实体

从 UIManagedDocument 到普通堆栈的核心数据迁移

UIManagedDocument 的迁移问题

在核心数据中使用 UIManagedDocument 的标准(或正确)方法是啥

你如何处理 UIManagedDocument?