iphone - 如何在应用程序退出时正确删除 "temporary"NSManagedObject

标签 iphone core-data nsmanagedobject nsmanagedobjectcontext

我创建一个临时 NSManagedObject 并将其与主 NSManagedObjectContext 关联。我需要能够将其视为上下文中功能齐全的对象(执行获取请求等),因此无法在没有关联上下文的情况下创建它。我在 ViewWillDisappear 中添加了删除托管对象的逻辑,前提是新的 View Controller 不仅仅被插入堆栈:

- (void)viewWillDisappear:(BOOL)animated { 
  [super viewWillDisappear:animated];

  NSArray *viewControllers = self.navigationController.viewControllers;
  if (viewControllers.count > 1 && [viewControllers objectAtIndex:viewControllers.count-2] == self) {
    // View is disappearing because a new view controller was pushed onto the stack
  } else  {
    // View is disappearing for some other reason
    [self.community.managedObjectContext deleteObject:self.community];
  }
}

除了应用程序退出之外,这似乎可以在所有情况下正确删除托管对象。我尝试删除 viewDidUnload 中的对象,但似乎在应用程序退出时不会调用该方法。我考虑过创建第二个托管对象上下文,但希望尽可能避免主要开销。

谢谢, 格雷厄姆

最佳答案

将托管对象作为类变量保留在共享实例中,以便可以从应用程序中的更多位置访问它,而不是处理它的类。

有两种情况:

1) iOS 4.0之前
当 applicationWillTerminate 时,您可以从上下文中删除该对象。

2) 自 iOS 4.0 起。
当您的应用程序进入后台并且您将终止该进程(使用“终止应用程序栏”的困难方法)时, applicationWillTerminate 将永远不会被调用。您无法识别此事件。所以你被 applicationWillTerminate 搞砸了。
你必须像这样解决它:
- applicationWillEnterBackground: -> 将标识符保存到 userdefaults 中的托管对象或简单文件中。
- applicationDidFinishLaunching: -> 如果文件存在,则删除它所引用的托管对象。
- applcationWillEnterForeground: -> 删除文件。

现在,当您的应用程序进入后台并返回时,您将具有相同的状态,并且该对象不会被删除。 当您终止应用程序时,该对象将在启动时被删除。

关于iphone - 如何在应用程序退出时正确删除 "temporary"NSManagedObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5129392/

相关文章:

iPhone WebKit CSS 动画导致闪烁

objective-c - NSManagedObject 的 NSPasteboard 类型

iphone - 我的 xcmappingmodel 中的自定义策略将不会执行

ios - 带有 iCloud 的 CoreData 驱动应用程序中带有 NSSortDescriptor 和 NSFetchedResultsController 的自定义部分

ios - 将新对象插入数据库时​​出现 SwiftdynamicCast 错误

cocoa - 使用绑定(bind)/核心数据时为 "[something copyWithZone:]: unrecognized selector sent to instance"

iphone - 我们可以使用google的方向API吗?

iphone - iPad视网膜图像-为什么使用两种不同的图像尺寸?

iphone - 取消 MFMailComposeViewController 的 ActionSheet 剪裁

ios - 如何将 NSMutableArray 保存到核心数据?