Как правильно удалить «временный» NSManagedObject при выходе из приложения - PullRequest
4 голосов
/ 26 февраля 2011

Я создаю временный 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 ]

1 голос
/ 27 февраля 2011

Храните управляемый объект в общем экземпляре или как переменную класса, чтобы его можно было получить из большего количества мест в вашем приложении, чем из класса, из которого вы его обрабатываете.* 1) до iOS 4.0Когда приложениеWillTerminate позволяет удалить объект из контекста.

2) Начиная с iOS 4.0.Когда ваше приложение перейдет в фоновый режим, и вы завершите процесс (сложный путь, с помощью «панели приложений kill»), applicationWillTerminate никогда не будет вызван.Вы не можете распознать это событие.Так что ваш ввернут с приложением WillTerminate.Вам придется решить это так:- applicationWillEnterBackground: -> сохранить идентификатор в управляемом объекте по умолчанию в файле пользователя или в простом файле.- applicationDidFinishLaunching: -> если файл существует, удалите управляемый объект, на который он ссылается.- applcationWillEnterForeground: -> удалить файл.

Теперь, когда ваше приложение переходит в фоновый режим и возвращается, у вас будет такое же состояние, и объект не будет удален.Когда вы убьете свое приложение, объект будет удален при запуске.

0 голосов
/ 20 апреля 2012

Я понимаю, что у вас уже есть рабочий ответ, но если ваш объект действительно временный и никогда не будет сохранен, почему бы просто не создать его в дочернем контексте? Он по-прежнему будет иметь всю видимость извлечения, которую вы пожелаете, но никогда не будет перенесен в другие контексты и не сохранен в физической базе данных, пока вы не вызовете save для контекста.

Если вы никогда не вызываете команду save, временный объект никогда не будет сохранен, что делает его действительно временным.

И кикер ... вам совсем не нужно писать никакого дополнительного кода или обрабатывать все "выходящие" условия, поскольку он никогда не попадал в фактическую базу данных.

0 голосов
/ 27 февраля 2011

applicationWillTerminate и его многозадачные кузены работают, но поскольку вы удаляете только один объект, лучшим способом является сохранение контекста после каждого удаления.

Просто позвоните - (BOOL)save:(NSError **)error:

[self.community.managedObjectContext deleteObject:self.community];
NSError *error = nil;
[self.community.managedObjectContext save:&error];
0 голосов
/ 27 февраля 2011

В вашем делегате приложения реализуйте метод -applicationWillTerminate :. Этот метод вызывается непосредственно перед удалением приложения из памяти, и вы можете удалить временный управляемый объект там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...