Использование NSCoding надлежащим образом в отношениях модели данных дедушка-родитель-ребенок
У меня есть дедушка, родитель и дочерние модели отношений (Orchestra
объект модели класса, который содержит много Section
с, и каждый содержит много Player
с). Другими словами, Orchestra
объект имеет свойство под названием var allSections: [Section]
и Section
Объект имеет свойство, называемое var allPlayers: [Player]
Моя цель - сохранить данные для всех трех моделей, используя NSCoding
, Я не понимаю, должен ли я соответствовать NSCoding
для (A) всех 3 классов, (B) только дочернего класса или (C) всех классов, кроме дочернего класса? Одним из источников моего замешательства является тот факт, что [ NSCoding
является рекурсивным][1].
Пока что я внедрил стандарт NSCoding
методы протокола для Player
:
func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: "playerName")
aCoder.encode(id, forKey: "playerId")
aCoder.encode(playerStatus, forKey: "playerStatus")
aCoder.encode(playerPosition, forKey: "playerPosition")
}
required init(coder aDecoder: NSCoder) {
name = aDecoder.decodeObject(forKey: "playerName") as! String
id = aDecoder.decodeObject(forKey: "playerId") as! String
playerStatus = aDecoder.decodeObject(forKey: "playerStatus") as! PlayerStatus
playerPosition = aDecoder.decodeObject(forKey: "playerPosition") as! PlayerPosition
super.init()
}
И в init
метод для Section
Я позвоню:
if let archivedItems = NSKeyedUnarchiver.unarchiveObject(withFile: itemArchivalURL.path) as? [Item] {
allPlayers = archivedItems
}
1 ответ
Все 3 должны соответствовать NSCoding
если вы хотите заархивировать экземпляр Orchestra
,
Если вы хотите только заархивировать Section
экземпляр, который только Section
а также Player
должен соответствовать NSCoding
,
Подумай об этом так. Любой объект, который вы хотите архивировать, должен сам соответствовать NSCoding
, И все, что вам нужно для кодирования / декодирования в этом классе, также должно соответствовать NSCoding
, И это должно быть истинным для всех классов, которые в конечном итоге должны быть закодированы / декодированы.