2009-12-02 15 views
7

Ich Initialisierung eines NSManagedObject Unterklasse mit:NSManagedObject Subklassen und setValuesForKeysWithDictionary:

- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues 

ich es auch die undefinierten Tasten wissentlich geben werde, was natürlich sollte eine Ausnahme werfen.

So habe ich realisiert:

- (void)setValue:(id)value forUndefinedKey:(NSString *)key 

Wenn ein Schlüssel nicht definiert ist, ich es auf den richtigen Schlüssel zuordnen.

Allerdings wird meine Implementierung nie aufgerufen, stattdessen wird Implementierung verwendet, die wiederum noch eine Ausnahme auslöst.

Gibt es ein Verhalten (oder Bug), das verhindert, setValuesForKeysWithDictionary:NSManagedObject Unterklassenimplementierung von setValue:forUndefinedKey: zu verwenden?

Hinzufügen von Code wie gewünscht, aber da ich nur eine bestehende Methode bin die Umsetzung, die nicht aufgerufen wird, ich weiß nicht, wie viel Hilfe wird es sein:

Im Zusammenhang:

- (Company*)companyWithDictionary:(NSDictionary*)values{ 

    Company* newCompany = (Company*)[NSEntityDescription insertNewObjectForEntityForName:@"Company" inManagedObjectContext:self]; 

    [newCompany setValuesForKeysWithDictionary:values]; 

    return newCompany; 
} 

In der Company Unterklasse (genannt nie):

- (void)setValue:(id)value forUndefinedKey:(NSString *)key{ 

    if([key isEqualToString:idKey]){ 

     [self setValue:value forKey:@"uniqueID"]; 

    }else if([key isEqualToString:descriptionKey]){ 

     [self setValue:value forKey:@"descriptionText"]; 

    }else if([key isEqualToString:timeUpdatedKey]){ 

     [self setValue:value forKey:@"dateUpdated"]; 

    }else{ 

     [super setValue:value forUndefinedKey:key]; 

    } 
} 

Antwort

3

Es gibt definitiv nichts intrinsisch NSManagedObject, die dies verhindert; Ich mache genau das in der App, an der ich gerade arbeite. Können Sie mehr von Ihrem Code posten?

Ein Gedanke, auch: Sind Sie sicher, es ist setValue:forUndefinedKey:, die die Ausnahme wirft? Für ein verwaltetes Objekt bin ich mir ziemlich sicher, dass Sie auch valueForUndefinedKey: (den Getter) implementieren müssen, damit die Dinge richtig funktionieren.

+0

Ja, ich sehe es in der Stack-Trace. Und es ist auch definitiv die Implementierung von NSManagedObject. –

+0

Ich habe ValueForUndefinedKey nicht implementiert :. Ich werde das versuchen, aber ich verstehe nicht, warum das durch den Setter aus dem Gleichgewicht geraten ist. –

+0

Hinzugefügt Code ... –

2

Einfache Frage, aber geben Sie den Klassennamen Ihrer NSManagedObject-Unterklasse für die Entität in Ihrem Modell an?

Sie haben auch gesagt, dass Sie das verwaltete Objekt initialisieren ... wie? Sie sollten es in den meisten Fällen über + [NSEntityDescription insertNewObjectForEntityForName: inManagedObjectContext:] einfügen, es sei denn, Sie haben einen guten Grund, dies nicht zu tun.

+0

Ja und Ja. Ich habe auch meine Modellklassen neu erstellt, um sicher zu gehen. Ich habe auch versucht, valueForUndefinedKey in der Modellklasse UND als Kategorie zu implementieren. –

+0

Das ist in der Tat seltsam. Können Sie das in einem reduzierten Testfall reproduzieren? Ich habe ähnliche Dinge gemacht, bin aber nie auf dieses Problem gestoßen. –

1

Ein schneller Class-Dump des CoreData-Frameworks zeigt an, dass auch setValuesForKeysWithDictionary: überschreibt, also sieht es so aus, als würde es einige Anpassungen für diese Methode vornehmen, vielleicht aus Leistungsgründen oder so ähnlich. Ich würde wahrscheinlich nur meine eigene Methode schreiben, die setValuesForKeysWithDictionary: äquivalent ist und stattdessen das ganze Durcheinander vermeiden. Etwas wie das:

- (void)mySetValuesForKeysWithDictionary:(NSDictionary*)dict 
{ 
    for (NSString* key in dict) 
     [self setValue:[dict objectForKey:key] forKey:key]; 
} 
+0

das ist im Wesentlichen was ich getan habe, aber unter Berücksichtigung von NSNull-Werten. Selbst nachdem ich Sixtens Lösung implementiert hatte, gab es einen anderen seltsamen Fehler, also habe ich das Handtuch geworfen. –