Was bedeutet es, NSCoding-konform zu sein?

8

Ich gehe also durch dieses Tutorial, und ich habe endlich herausgefunden, wie man ein Objekt mit NSCoding archiviert und es auch wieder mit dem fehlbaren Initialisierer aus dem Dateisystem initialisiert.

%Vor%

Ich bin jedoch immer noch etwas unsicher, wie dieser ganze Prozess auf hohem Niveau funktioniert. Bitte sagen Sie mir, wo mein Denken falsch ist.

1) Wenn Ihr Objekt das NSCoding-Protokoll annimmt, können Sie die Funktion encode (with :) verwenden, um ein NSCoder-Objekt durch die Funktion zu leiten und eine 'encode'-Methode auszuführen, die die instance -Eigenschaft des Objekts (also ein Objekt selbst) als erstes Argument und eine Zeichenfolge, die einen Schlüssel als zweiten Wert darstellt.

2) Dies ist ein rekursiver Prozess. Der Grund dafür, dass Sie die Instanzeigenschaft (dh den Namen) Ihres Objekts übergeben, besteht darin, dass die DATA-Eigenschaft (die ein Objekt ist), die Codierungsnachricht usw. gesendet werden kann weiter unten auf der Linie, bis es einen NSCoding Adopter nicht mehr erreicht.

3) Das aDecoder-Objekt kann auch Dinge dekodieren. Daher sollten Sie bei der Initialisierung Ihres benutzerdefinierten Objekts den nicht initialisierbaren Initialisierer verwenden, um das Objekt zu dekodieren, das für den verwendeten mehrdeutigen Zeichenfolgenschlüssel festgelegt wurde.

Hier ist, was ich wirklich nicht verstehe ...

Wie weiß das aDecoder-Objekt, welches einzelne Objekt für den Schlüsselsatz verwendet werden soll? Nehmen wir zum Beispiel an, ich habe 10 Instanzen von Hundeobjekten. Wenn das System einen Decoder übergibt und ich die Methode decodeObject darauf verwende und es self.name auf den Wert dieses dekodierten Objekts per Schlüssel setzt, weiß der aDecoder, dass der Name dieses Hundes als "Jack" gespeichert wurde und nicht einen der Namen der anderen Hundeexemplare zufällig übernehmen, wie "Jodi"?

Mit anderen Worten: Sobald Sie die Eigenschaften eines Objekts kodieren, weiß das Dateisystem, dass die Eigenschaften der Objektinstanz A von den Eigenschaften der Objektinstanz B getrennt bleiben sollen. Wenn die App also gebootet wird, wird das Objekt A initialisiert greift es nur die Eigenschaften von Objekt A auf?

Danke

    
user7024499 19.12.2016, 23:49
quelle

2 Antworten

1

Ich denke, das fehlende Stück (korrigiert mich, wenn ich falsch liege) ist, dass NSCoding keine Datenbank ist. Es ist ein Protokoll, das eine Möglichkeit zum Serialisieren eines Objekts definiert.

Der NSCoder, der zum Decodieren verwendet wird, weiß, welches Objekt, weil es das ist, das in es codiert wurde. Wenn Sie beispielsweise einen NSKeyedArchiver (eine NSCoder-Unterklasse und eine gängige Methode zur Verwendung von NSCoding) verwenden, um Ihren Hund in einer Datei auf dem Datenträger mit dem Namen "/tmp/jack.dog" zu speichern, können Sie später einen NSKeyedUnarchiver zum Laden verwenden. " /tmp/jack.dog ", und es in eine Dog-Instanz zu deserialisieren. Es "weiß, welches Objekt", denn das ist das einzige, das in dieser Datei gespeichert wurde.

Es muss keine Datei sein. Die Daten könnten überall gespeichert werden .

    
WhatsUpNSDoc 19.12.2016 23:55
quelle
1

Sie könnten also tatsächlich einen verschlüsselten Archivierer verwenden, indem Sie class func archivedData(withRootObject rootObject: Any) -> Data' aufrufen, ein Objekt übergeben und eine Instanz von Data zurückerhalten, die Sie dann auf dem Datenträger speichern können.

Was sind das für Daten? Es ist eine Repräsentation des übergebenen Objekts rootObject , das den Namen der Objektklasse und eine Gruppe von Schlüsseln und zugeordneten Werten enthält (wobei diese zugeordneten Werte ähnlich codiert sind). Es ist also eine hierarchische Darstellung eines Objektgraphen mit den zugehörigen Objektdaten.

Sagen Sie, dass das Objekt Ihre Dog -Instanz war, es kennt diese Klasse und alle zugehörigen Hundeattribute.

Sagen Sie stattdessen, dass das Objekt ein Array von 10 Dog Instanzen war, jetzt speichert das Array einen Satz von codierten Objekten gegen ihre Indizes, wobei jedes codierte Objekt seine Klasse und zugehörige Hund-Attribute kennt, und der Encoder speichert diese Wurzel Objekt ist ein Array.

Es sind also diese zusätzlichen Daten, die vom Encoder verwaltet werden (und vom Decoder verwendet werden), damit er weiß, was zu tun ist, wenn Sie ihm Daten (z. B. aus einer Datei) übergeben und ihn zur Decodierung auffordern .

    
Wain 22.12.2016 15:45
quelle

Tags und Links