Что значит быть NSCoding-совместимым?
Итак, я прошёл этот урок и наконец-то понял, как заархивировать объект с помощью 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()
}
Тем не менее, я все еще немного не уверен в том, как весь этот процесс работает на высоком уровне. Пожалуйста, скажите мне, где мое мышление неверно.
1) Если ваш объект принимает протокол NSCoding, вы можете использовать функцию encode(with:) для того, чтобы NSCoder-объект проходил через функцию и выполнял метод 'encode', передавая свойство экземпляра вашего объекта (который сам является объектом).) в качестве первого аргумента и строка, представляющая ключ в качестве второго значения.
2) Это рекурсивный процесс, поэтому, по сути, причина, по которой вы передаете свойство экземпляра вашего объекта (то есть имя), заключается в том, что свойство TH (которое является объектом) может отправлять сообщение кодирования и т. Д. И т. Д. Вниз по линия, пока это больше не достигает приемника NSCoding.
3) Объект aDecoder также может декодировать объекты, поэтому после инициализации вашего пользовательского объекта вы захотите использовать сбойный инициализатор для декодирования любого объекта, который был установлен для неоднозначного строкового ключа, который вы использовали.
Вот что я действительно не понимаю...
Как объект aDecoder узнает, какой отдельный объект использовать для набора ключей? Например, скажем, у меня есть 10 экземпляров объекта собаки. Когда система пропускает aDecoder, и я использую для него метод decodeObject, и он устанавливает для self.name значение этого декодированного объекта по ключу, как aDecoder узнает, что имя этой собаки было сохранено как "Джек", а не случайно схватить одно из имен инстанса другой собаки, например "Джоди"?
Другими словами, как только вы закодируете свойства объекта, как файловая система узнает, что свойства экземпляра A объекта должны быть отделены от свойств экземпляра B объекта, таким образом, когда приложение загружается обратно и объект A инициализируется, он только захватывает свойства объекта А?
Спасибо
2 ответа
Таким образом, вы можете использовать архиватор с ключом, вызвав class func archivedData(withRootObject rootObject: Any) -> Data'
, передав ему какой-то объект и получив экземпляр Data
что вы можете затем сохранить на диске.
Что это за данные? Это представление переданного объекта, rootObject
, который включает в себя имя класса объектов и набор ключей и связанных значений (где эти связанные значения закодированы аналогичным образом). Таким образом, это иерархическое представление графа объекта со связанными данными объекта.
Скажите, что этот объект был вашим Dog
Например, он знает этот класс и все связанные атрибуты собаки.
Скажем, вместо этого объект был массивом из 10 Dog
экземпляры, теперь массив будет хранить набор закодированных объектов по своим индексам, каждый закодированный объект знает свой класс и связанные с ним атрибуты собаки, а кодировщик сохраняет, что корневой объект является массивом.
Таким образом, именно эти дополнительные данные управляются кодером (и используются декодером), что позволяет ему знать, что делать, когда вы передаете ему некоторые данные (например, из файла) и запрашивает их декодирование.
Я думаю, что вы упускаете часть (поправьте меня, если я ошибаюсь), что NSCoding не является базой данных. Это протокол, который определяет способ сериализации объекта.
NSCoder, используемый для декодирования, знает, какой объект, потому что это тот, который был закодирован в него. Например, если вы использовали NSKeyedArchiver (подкласс NSCoder и распространенный способ использования NSCoding), чтобы сохранить свою собаку в файл на диске с именем "/tmp/jack.dog", то позднее вы можете использовать NSKeyedUnarchiver для загрузки " /tmp/jack.dog "и десериализовать его обратно в экземпляр Dog. Он "знает, какой объект", потому что это (единственный) объект, который был сохранен в этом файле.
Это не должен быть файл. Данные могут быть сохранены в любом месте вообще.