У меня есть следующая архитектура данных, где Orchestra
имеет много Section
, а каждый Section
имеет много Player
:
Все 3 класса соответствуют протоколу NSCoding
и имеют необходимые реализованные методы. Согласно этому вопросу SO, он должен работать, поскольку NSCoding работает рекурсивно.
Внутри одноэлементного класса Orchestra
у меня есть следующие методы для сохранения и извлечения Section
s:
let sectionArchivalURL: URL = {
let documentDirectories = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentDirectory = documentDirectories.first!
return documentDirectory.appendingPathComponent("sections.archive") //gets archived Player objects
} ()
func saveChanges() -> Bool {
print ("Saving sections to: \(sectionArchivalURL.path)")
return NSKeyedArchiver.archiveRootObject(allSections, toFile: sectionArchivalURL.path)
}
Section
также соответствует NSCoding
:
//MARK: - NSCoding methods
func encode(with aCoder: NSCoder) {
aCoder.encode(sectionName, forKey: "sectionName")
aCoder.encode(allPlayers, forKey: "allPlayers")
}
required init(coder aDecoder: NSCoder) {
sectionName = aDecoder.decodeObject(forKey: "sectionName") as! String
allPlayers = aDecoder.decodeObject(forKey: "allPlayers") as! [Player]
super.init()
}
Точно так же Player
также соответствует NSCoding
:
//MARK: - NSCoding methods
func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: "playerName")
print ("encoding Player") //does not get called
}
required init(coder aDecoder: NSCoder) {
name = aDecoder.decodeObject(forKey: "playerName") as! String
super.init()
}
Сохранение подтверждено рабочим. Однако, когда приложение перезапускается, я могу просматривать свои команды, но содержащие Player
s пусты. Я также знаю, что функция кодирования в Player
не вызывалась. Что я делаю неправильно?
Player
. - person Phillip Mills   schedule 03.04.2017Player
. - person daspianist   schedule 03.04.2017