я архивировать массив моей NSCoding соответствующих требований класса «Назначение» в файл в общем (App Groups) контейнер:NSInvalidUnarchiveOperationException подняли только в расширении IOS, а не основное приложение
class private func updateSharedFiles() {
let path = NSFileManager().containerURLForSecurityApplicationGroupIdentifier("group.agenda-touch")!.path! + "/widgetData"
if let incompleteAssignmentsArray = self.incompleteAssignments {
NSKeyedArchiver.archiveRootObject(incompleteAssignmentsArray, toFile: path)
}
}
Теперь, когда мое расширение хочет прочитать из этого файла, который я назвал NSFileManager.fileExistsAtPath: в файле и он возвращает true. Наконец, я вызываю NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? AssignmentArray
и получаю исключение NSInvalidUnarchiveOperationException. Дело в том, что, когда я отформатирую файл в своем основном приложении, я не получаю такого исключения. И чтобы быть ясным, я добавил Assignment.swift в мои компилируемые источники для виджета. Поэтому мой TodayViewController знает, что такое Assignment, но не может его декодировать по какой-то причине. В качестве дополнения, здесь реализация NSCoding для задания:
//MARK: NSCoding
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.assignmentName, forKey: "assignmentName")
aCoder.encodeObject(self.assignmentDueDate, forKey: "assignmentDueDate")
aCoder.encodeObject(self.assignmentSubject, forKey: "assignmentSubject")
aCoder.encodeBool(self.completed, forKey: "assignmentCompleted")
aCoder.encodeObject(self.creationDate, forKey: "assignmentCreationDate")
aCoder.encodeInteger(self.assignmentType.rawValue, forKey: "assignmentType")
aCoder.encodeBool(self.earmarkedForDeletion, forKey: "assignmentEarmarked")
aCoder.encodeObject(self.modificationDates, forKey: "assignmentModificationDates")
}
required convenience init(coder aDecoder: NSCoder) {
let assignmentName = aDecoder.decodeObjectForKey("assignmentName") as String
let assignmentDueDate = aDecoder.decodeObjectForKey("assignmentDueDate") as NSDate
let assignmentSubject = aDecoder.decodeObjectForKey("assignmentSubject") as String
let completed = aDecoder.decodeBoolForKey("assignmentCompleted")
self.init(name:assignmentName,dueDate:assignmentDueDate,subject:assignmentSubject,completed:completed)
self.creationDate = aDecoder.decodeObjectForKey("assignmentCreationDate") as NSDate
let assignmentTypeRaw = aDecoder.decodeIntegerForKey("assignmentType")
self.assignmentType = AssignmentType(rawValue: assignmentTypeRaw)!
self.earmarkedForDeletion = aDecoder.decodeBoolForKey("assignmentEarmarked")
self.modificationDates = aDecoder.decodeObjectForKey("assignmentModificationDates") as Dictionary<String,NSDate>
}
Ждать, я не думаю, что это ответ. – PopKernel
Извините, я не мог комментировать исходный вопрос из-за низкой репутации. :) Я редактировал сообщение, поэтому он может содержать ответ на исходный вопрос. – helkarli
Все, что необходимо, это вызвать 'NSKeyedArchiver.setClassname' и' NSKeyedUnarchiver.setClass'. Принятие «NSSecureCoding» не должно иметь никакого значения. Основная проблема заключается в том, что имя класса сохраняется, включая модуль, а ваше расширение и основное приложение имеют разные имена модулей. – ianthetechie