2016-06-25 3 views
1

У меня есть управляемый объект с именем SpecialItem и call setSubcategory для изменения подкатегории. Когда я сохраняю временный контекст и сливаюсь с основным контекстом, как-то setSubcategory называется передачей в nil в качестве подкатегории. Это часто приводит к тому, что объект SpecialItem сохраняется с myProperty, установленным в nil. Я не знаю, что вызывает setSubcategory. Я не называю явно setSubcategory: nil.свойство управляемого объекта становится nil после слияния контекстов управляемого объекта

Мой вопрос: что происходит и как я могу это исправить?

Это управляемая реализация объекта:

@interface SpecialItem : GenericItem 
@property (nonatomic, strong) Subcategory *subcategory; 
@property (nonatomic, strong) MyProperty *myProperty; 
@end 

@implementation SpecialItem 
@dynamic subcategory; 
@dynamic myProperty; 

- (void)setSubcategory:(Subcategory *)subcategory 
{ 
    [self willChangeValueForKey:@"subcategory"]; 
    [self willChangeValueForKey:@"myProperty"]; 

    [self setPrimitiveValue:subcategory forKey:@"subcategory"]; 
    [self setPrimitiveValue:subcategory.category.myProperty forKey:@"myProperty"]; 

    [self didChangeValueForKey:@"myProperty"]; 
    [self didChangeValueForKey:@"subcategory"]; 
} 
// ... 

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

self.tempContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
self.tempContext.parentContext = self.dataManager.mainContext; 

В конце концов, у меня есть это:

[self saveTempContext]; 

Вот saveContext осуществление:

- (void)saveContext 
{ 
    LogAndPrint(@"Before save."); 
    [self.tempContext performBlockAndWait:^{ 
     NSError *error = nil; 
     if (![self.tempContext save:&error]) 
     { 
     LogAndPrint(@"Error occurred while saving context: %@", error); 
     } 
    }]; 

    LogAndPrint(@"Middle of save."); 

    [self.dataManager.mainContext performBlockAndWait:^{ 
     NSError *error = nil; 
     if (![self.dataManager.mainContext save:&error]) 
     { 
     LogAndPrint(@"Error occurred while saving context: %@", error); 
     } 
    }]; 

    [self.dataManager synchronize]; 
    LogAndPrint(@"After save."); 
} 

Вот реализация синхронизирует:

- (void)synchronize 
{ 
    LogAndPrint(@"Synchronizing Core Data changes."); 
    if (self.persistentContext.hasChanges) { 
     [self.persistentContext performBlockAndWait:^{ 
     NSError *error = nil; 
     if (![self.persistentContext save:&error]) { 
      LogAndPrint(@"Error occurred while saving persistent context: %@", error); 
     } 
     }]; 
    } 
} 

ответ

0

Я никогда не был в состоянии понять, почему это происходит. Но я нашел решение, которое работает. Я изменил код, вызывающий setSubcategory, для вызова нового метода с именем [SpecialItem updateSubcategory: subcategory].

- (void)updateSubcategory:(Subcategory *)subcategory 
{ 
    self.subcategory = subcategory; 
    self.myProperty = subcategory.category.myProperty; 
} 

Это исправлено, и код работает нормально уже несколько месяцев.

Смежные вопросы