2016-12-19 20 views
8

Więc idę przez ten samouczek, a ja w końcu zorientowali się, jak archiwizować obiektu przy użyciu NSCoding, a także zainicjować je z katalogu ponownie z failable inicjatora.Co to znaczy być zgodnym z NSCoding?

// To encode the object in the first place 

func encode(with aCoder: NSCoder) { 
     aCoder.encode(name, forKey: "name") 
} 

// To 're-initialize' the object 

required init?(coder aDecoder: NSCoder) { 
    self.name = aDecoder.decodeObject(forKey: "name") as! String 
    super.init() 
} 

Jednak nadal jestem trochę niepewny o tym, jak cały ten proces działa na wysokim poziomie. Proszę powiedz mi, gdzie moje myślenie jest nieprawidłowe.

1) Jeśli Twój obiekt przyjmuje protokół NSCoding, możesz użyć funkcji encode (z :), aby obiekt NSCoder przeszedł przez funkcję i wykonać metodę 'encode', przekazując właściwość instancji obiektu (która jest sam obiekt) jako pierwszy argument, a ciąg reprezentujący klucz jako druga wartość.

2) Jest to proces rekursywny, więc zasadniczo powodem, dla którego przekazujesz właściwość obiektu obiektu (tj. Nazwę), jest to, że TAKIE (która jest obiektem) może zostać wysłana wiadomość kodowania, i tak dalej oraz i tak dalej, aż przestanie docierać do urządzenia pobierającego NSCoding.

3) Obiekt aDecoder może również dekodować pewne rzeczy, więc po zainicjowaniu niestandardowego obiektu, będziesz chciał użyć uszkodzonego inicjalizatora do zdekodowania dowolnego obiektu dla niejednoznacznego klucza ciągu, którego użyłeś.

Oto co ja naprawdę nie rozumiem ...

jaki sposób obiekt aDecoder wiedzieć, które pojedynczy obiekt użyć do zestawu kluczy? Na przykład, powiedzmy, że mam 10 instancji obiektu psa. Kiedy system przechodzi aDekoderem, a ja używam metody decodeObject na nim, i ustawia self.name na wartość tego dekodowanego obiektu kluczem, w jaki sposób aDecoder wie, że nazwa tego psa została zapisana jako "Jack", a nie do uchwycić przypadkowo jedno z pozostałych nazw instancji psa, na przykład "Jodi"?

Innymi słowy, po zakodowaniu właściwości obiektu, w jaki sposób system plików wie, że właściwości instancji obiektu A są oddzielone od właściwości obiektu B, a więc w ten sposób, gdy aplikacja zostanie uruchomiona z powrotem, a obiekt A otrzyma zainicjowany, pobiera tylko właściwości obiektu A?

Dzięki

Odpowiedz

1

myślę kawałek tracisz (poprawcie mnie jeśli się mylę) jest to, że NSCoding nie jest bazą danych. Jest to protokół definiujący sposób serializowania obiektu.

NSCoder stosowany do dekodowania wie, który obiekt, ponieważ jest to taki, który został zakodowany w nim. Na przykład, jeśli użyłeś NSKeyedArchiver (podklasy NSCoder i popularnego sposobu używania NSCoding), aby zapisać swojego psa do pliku na dysku o nazwie "/tmp/jack.dog", możesz później użyć NSKeyedUnarchiver do załadowania " /tmp/jack.dog "i deserializować go z powrotem do instancji Dog. "Wie, który obiekt", ponieważ jest to (jedyny), który został zapisany w tym pliku.

To nie musi być plikiem. Dane można zapisać anywhere at all.

+0

Do tego chciałbym dodać, że wykres obiektów jest przechowywany hierarchicznie w dół od pojedynczego obiektu głównego. Jeśli ten wykres obiektów zawiera pętle, zostanie zapisany tylko jeden raz, a kolejne punkty, do których odwołuje się ten obiekt, mają odwołania wstecz do pierwszej kopii obiektu. – dgatwood

1

Tak więc, możesz rzeczywiście użyć archiwizatora z kluczami, wywołując class func archivedData(withRootObject rootObject: Any) -> Data', przekazując mu jakiś obiekt i odsyłając instancję Data, którą możesz następnie utrwalić na dysku.

Co to dane? Jest to reprezentacja przekazanego obiektu, rootObject, który zawiera nazwę klasy obiektów oraz zestaw kluczy i powiązanych wartości (w których podobne wartości są w podobny sposób zakodowane). Jest to hierarchiczna reprezentacja wykresu obiektowego wraz z powiązanymi danymi obiektu.

Powiedzmy, że obiekt był Twoją instancją Dog, zna tę klasę i wszystkie powiązane atrybuty psa.

Zamiast tego powiedzmy, że obiekt był tablicą instancji 10 Dog, teraz tablica będzie przechowywać zbiór zakodowanych obiektów w ich indeksach, każdy zakodowany obiekt znający klasę i powiązane atrybuty psa, a koder zapisuje obiekt główny jest tablicą.

To te dodatkowe dane są zarządzane przez koder (i używane przez dekoder), dzięki czemu mogą wiedzieć, co zrobić, gdy przekazane zostaną niektóre dane (np. Z pliku) i poprosić o ich dekodowane.