2016-06-25 7 views
1

Ich habe ein verwaltetes Objekt namens SpecialItem und rufe setSubcategory auf, um die Unterkategorie zu ändern. Wenn ich den temporären Kontext speichere und mit dem Hauptkontext zusammenführe, wird irgendwie setSubcategory aufgerufen, wobei nil als Unterkategorie übergeben wird. Dies führt oft dazu, dass das SpecialItem-Objekt mit myProperty auf Null gespeichert wird. Ich weiß nicht, was setSubcategory aufruft. Ich rufe nicht ausdrücklich setSubcategory: nil auf.Eigenschaft des verwalteten Objekts wird nach dem Zusammenführen der Kontexte des verwalteten Objekts zu null

Meine Frage ist, was passiert und wie kann ich das beheben?

Dies ist das verwaltete Objekt Implementierung:

@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"]; 
} 
// ... 

Die verwalteten Objekt Kontexte sind Setup wie so:

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

Schließlich das ich habe:

[self saveTempContext]; 

Hier ist die saveContext Implementierung:

Hier
- (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."); 
} 

ist die synchronize Umsetzung:

- (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); 
     } 
     }]; 
    } 
} 

Antwort

0

ich war nie in der Lage, herauszufinden, warum dies geschieht. Aber ich habe eine Lösung gefunden, die funktioniert. Ich habe den Code, der setSubcategory aufruft, geändert, um eine neue Methode namens [SpecialItem updateSubcategory: subcategory] aufzurufen.

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

Das hat es behoben und der Code hat seit einigen Monaten gut funktioniert.