Использовать собственное свойство контекста NSManagedObject для его удаления?

#objective-c #nsmanagedobject

#objective-c #nsmanagedobject

Вопрос:

Это может быть довольно наивно, но мне было интересно, правильно ли использовать следующий оператор для удаления управляемого объекта из постоянного хранилища основных данных:

 [managedObject.managedObjectContext deleteObject:managedObject];
 

Я запустил вышеуказанное в отладчике Xcode — он не жаловался, но содержимое объекта все еще было там. Может ли быть так, что на контекст ссылались через объект, подлежащий удалению, и, таким образом, вызывая блокировку памяти, предотвращающую удаление объекта?

Комментарии:

1. Хорошо, если для его удаления разрешено использовать собственное свойство объекта NSManagedObjectContext, почему бы не определить метод ‘DeleteObject’ без каких-либо параметров и использовать свойство контекста объекта? Кроме того, я не могу представить ситуацию, когда у вас был бы определен NSManagedObject в одном контексте, но вы хотели бы удалить его из другого — может кто-нибудь привести мне пример?

Ответ №1:

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

Я не могу ответить конкретно, если у вас возникнет проблема со ссылкой на managedObjectContext в managedObject, поскольку я обычно использую «DataManager» для управления моим managedObjectContext. Ниже приведен пример метода удаления, который я использовал в одном из моих DataManager:

 - (void)deleteReport:(Report*)aReport inContext:(NSManagedObjectContext*)context {
    if (aReport != nil) {
       if (context == nil) {
           context = self.managedObjectContext;
       }

       context.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy;
       [context deleteObject:aReport];

       NSError *error = nil;
       [context save:amp;error];
       if (error) {
           //NSLog(@"%@", error);
       }
   }}
 

РЕДАКТИРОВАТЬ: Для пояснения, отчет в этом методе является экземпляром NSManagedObject , и метод принимает NSManagedObjectContext в качестве параметра, поскольку приложение, из которого оно было извлечено, поддерживает использование нескольких контекстов.