如何在应用程序退出时正确删除“临时”NSManagedObject

时间:2011-02-26 20:01:31

标签: iphone core-data nsmanagedobject nsmanagedobjectcontext

我创建一个临时NSManagedObject并将其与主NSManagedObjectContext关联。我需要能够在上下文中将其视为一个功能完备的对象(执行获取请求等),因此在没有关联的上下文的情况下无法创建它。我包含了在ViewWillDisappear中删除托管对象的逻辑,条件是新的视图控制器不仅仅被压入堆栈:

- (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中的对象,但似乎该方法不会在应用程序退出时调用。我考虑过创建第二个托管对象上下文,但是如果可能的话,希望避免主要的开销。

谢谢, 格雷厄姆

4 个答案:

答案 0 :(得分:1)

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

有两种情况:

1)在iOS 4.0之前 当applicationWillTerminate你可以从上下文中删除对象。

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

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

答案 1 :(得分:0)

在您的app委托中,实现-applicationWillTerminate:方法。在从内存中清除应用程序之前调用此方法,您可以在那里删除临时托管对象。

答案 2 :(得分:0)

applicationWillTerminate及其多任务表兄弟工作,但由于您只删除单个对象,最好的方法是在每次删除后保存您的上下文。

只需致电- (BOOL)save:(NSError **)error

[self.community.managedObjectContext deleteObject:self.community];
NSError *error = nil;
[self.community.managedObjectContext save:&error];

答案 3 :(得分:0)

我知道你已经有了一个可行的答案,但是如果你的对象是真正的临时对象,并且永远不会被保存,为什么不在子环境中创建它?它仍然具有您想要的所有提取可见性,但在您在上下文中调用save之前,它将永远不会被推送到其他上下文,也不会保存在物理数据库中。

如果您从未调用过save,则永远不会保存临时对象,从而真正使其成为临时对象。

并且踢球者......你根本不需要编写任何额外的代码或处理所有“退出”的条件,因为它从未被放入实际的数据库中。