Warum würde ich ein transientes Attribut verwenden, um eine abgeleitete schreibgeschützte Eigenschaft in Core-Daten darzustellen?

8

Gibt es überhaupt einen Grund, ein transientes Attribut für eine abgeleitete Eigenschaft zu modellieren, wenn es nur gelesen werden kann? Es scheint viel einfacher zu sein, einfach eine Eigenschaft in meiner benutzerdefinierten Klasse zu deklarieren und dann den Wert im Getter on Fly zu berechnen. Ich würde dies mit keyPathsForValuesAffecting kombinieren, um Beobachter über Änderungen zu informieren. Wenn ich Caching benötigen würde, würde ich einfach ein Ivar für die Eigenschaft hinzufügen und es zurücksetzen, wenn sich einer der zugrunde liegenden Werte ändert (wie in der Antwort auf diese Frage).

Wäre es bei der Modellierung als transientes Attribut von Vorteil?

    
Lukas 31.10.2011, 17:15
quelle

1 Antwort

7

Ich tat genau das, wegen dieses Zitats aus dem Core Data Programming Guide: "Stellen Sie sich eine Anwendung vor, in der Sie eine Person-Entität mit den Attributen firstName und lastName und eine zwischengespeicherte transiente abgeleitete Eigenschaft fullName haben". Ich glaube, ich kam auf die Idee, dass das eine gute Sache wäre.

Allerdings , fährt er fort, "(in der Praxis ist es vielleicht unwahrscheinlich, dass ein FullName-Attribut zwischengespeichert wird, aber das Beispiel ist einfach zu verstehen).", ließ mich dies wissen Das war zum Beispiel nur das, was sie beschrieben haben, aber wahrscheinlich keine gute Umsetzung.

Nachdem ich mehr über transiente Eigenschaften und deren beabsichtigte Verwendung gelesen hatte, wurde mir klar, dass dies wahrscheinlich eine schlechte Art ist, sie zu verwenden. Ich habe keinen Vorteil davon, dass es für meine Implementierung zwischengespeichert wurde. Ich mochte die Fähigkeit, die Punktnotation zu verwenden (weil es eine Eigenschaft ist), anstatt eine Nachricht an das Objekt senden zu müssen, aber ich glaube nicht, dass es einen Leistungsgewinn durch die Verwendung gibt.

Noch wichtiger ist, dass ich glaube, dass der Overhead, ihn zu einer Eigenschaft zu machen, die der Kontext verwalteter Objekte verfolgen muss, tatsächlich eine schlechte Sache ist.

Also refaktoriere ich meine App so, dass ich nun diese einfachen Instanzmethoden für die Unterklasse meiner ManagedObject-Entität mache, und gebe nur die Ergebnisse zurück, da ich keinen wirklichen Vorteil sehen kann, sie zu transienten Eigenschaften zu machen.

Der Grund für die Verwendung ist, dass Sie tatsächlich etwas beibehalten müssen, das nicht zu einem der managedObject-Typen passt. Sie erstellen dann im Grunde zwei Eigenschaften. Eine, die transient ist und die wahre Repräsentation Ihres Objekts darstellt, für die Sie Getter und Setter schreiben, und eine andere, die höchstwahrscheinlich ein binärer Datentyp ist, der nur intern von der Untereinheit der Core-Datenentität verwendet wird, um den Wert der anderen Objekte zu erhalten (s) in einem Speicherobjekt.

Zumindest verstehe ich, wie das alles funktioniert. Kommentare sind sehr willkommen, wenn ich etwas falsch verstanden habe, da es für mich auch sehr verwirrend war.

    
DataJock 19.01.2012, 00:44
quelle

Tags und Links