2008-09-24 4 views
11

Apples documentation on -setPrimitiveValue:forKey: ist auf zwei Arten vage, wenn es verwendet wird, um zu viele Beziehungen zu verwalten.setPrimitiveValue: forKey: und to-many Beziehungen

Zuerst stellen sie fest:

Wenn Sie versuchen, eine n-Beziehung zu einem neuen NSMutableSet Objekt zu setzen, wird es (eventuell) scheitern.

Schließlich ?! Was bedeutet das überhaupt? Wird es später während -[NSManagedObjectContext save:] scheitern? Wenn ein verwaltetes Objekt in einen Fehler umgewandelt und dann zurückgesendet wird? Wann? Kann ich einen Testfall schreiben, um den Fehler bei Bedarf ständig neu zu erstellen?

Zweitens Beispielcode Bereitstellung richtig, diesen Fall zu behandeln, schreiben sie:

zuerst die vorhandene Set primitiveValueForKey: mit bekommen

(sicherzustellen, die Methode nicht nil zurückkehrt) Was soll ich tun ob/wann die Methode zurückgibt nil? assert() und sofort fehlschlagen, weil das gesamte Objektdiagramm beschädigt ist und das Speichern zu Datenverlust führt? NSAssert() darauf als Warnung für den Anrufer, aber drücken Sie auf (stumm nichts zu tun)?

Im Moment bin ich einfach direkt meine Zuordnung NS[Mutable]Set in diesem Fall erwünscht, etwa so:

- (void)setChildren:(NSSet*)value_ { 
    NSMutableSet *mutableRelationshipSet = [[[self primitiveValueForKey:@"children"] mutableCopy] autorelease]; 
    if (mutableRelationshipSet) { 
     [mutableRelationshipSet setSet:value_]; 
     [self setPrimitiveValue:mutableRelationshipSet forKey:@"children"]; 
    } else { 
     [self setPrimitiveValue:value_ forKey:@"children"]; 
    } 
} 

Ist das falsch?

Antwort

6

Ändern Sie einfach den Rückgabewert von -primitiveValueForKey: als veränderbare Menge und vertrauen Sie darauf, dass der Rückgabewert das Richtige tut.

Achten Sie darauf, auch -willChangeValueForKey:withSetMutation:usingObjects: und -didChangeValueForKey:withSetMutation:usingObjects: um Ihre Manipulation zu verwenden; Sie haben dies in Ihrem obigen Code nicht angezeigt.

Wenn Sie sich an Leopard wenden können, müssen Sie sich keine Gedanken darüber machen. Sie können Core-Data verwenden stattdessen integrierte Eigenschaft Unterstützung:

#import <CoreData/CoreData.h> 

@interface Folder : NSManagedObject 
@property (readwrite, retain) NSSet *children; 
@end 

@implementation Folder 
@dynamic children; 
@end 

Core Data generiert nicht nur einen Getter/Setter-Paar für die children Eigenschaft aber die wandelbaren-Set-Accessoren als gut, so dass Sie -mutableSetValueForKey: auf sie verwenden können und manipulieren Sie das Ergebnis mit einem Minimum an Overhead.