【发布时间】:2017-07-20 09:45:48
【问题描述】:
我有一个 CoreData 实体 SavedWorkout。它具有以下属性:
completionCounter 是Bool 的数组,workout 是一个名为Workout 的自定义类。
我正在像这样保存我的数据:
let saveCompletionCounter = currentCompletionCounter
let saveDate = Date() as NSDate
let saveRoutineIndex = Int16(currentWorkoutRoutine)
let saveWorkout = NSKeyedArchiver.archivedData(withRootObject: workout)
item.setValue(saveDate, forKey: "date")
item.setValue(saveWorkout, forKey: "workout")
item.setValue(saveRoutineIndex, forKey: "routineIndex")
item.setValue(saveCompletionCounter, forKey: "completionCounter")
do {
try moc.save()
print("save successful")
} catch {
print("saving error")
}
其中moc 是NSManagedObjectContext 的一个实例,item 是NSManagedObject 的一个实例:
moc = appDelegate.managedObjectContext
entity = NSEntityDescription.entity(forEntityName: "SavedWorkout", in: moc)!
item = NSManagedObject(entity: entity, insertInto: moc)
根据this和this和this,我已经让我的Workout类符合NSObject和NSCoding,所以现在看起来像这样:
class Workout: NSObject, NSCoding {
let name: String
let imageName: String
let routine: [WorkoutRoutine]
let shortDescription: String
required init?(coder aDecoder: NSCoder) {
name = aDecoder.decodeObject(forKey: "name") as! String
imageName = aDecoder.decodeObject(forKey: "imageName") as! String
routine = aDecoder.decodeObject(forKey: "routine") as! [WorkoutRoutine]
shortDescription = aDecoder.decodeObject(forKey: "shortDescription") as! String
}
func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: "name")
aCoder.encode(imageName, forKey: "imageName")
aCoder.encode(routine, forKey: "routine")
aCoder.encode(shortDescription, forKey: "shortDescription")
}
init(name: String, imageName: String, routine: [WorkoutRoutine], shortDescription: String) {
self.name = name
self.imageName = imageName
self.routine = routine
self.shortDescription = shortDescription
}
}
但是我总是在routine: aDecoder.decodeObject... 行收到错误。
错误提示:
NSForwarding: warning: object 0x60800002cbe0 of class 'App.WorkoutRoutine' does not implement methodSignatureForSelector: -- trouble ahead
Unrecognized selector -[FitLift.WorkoutRoutine replacementObjectForKeyedArchiver:]
为什么这给我一个错误而不是另一个Transformable 属性?如何将自定义类保存为 CoreData 实体的属性?
【问题讨论】:
-
您还有一个名为
WorkOutRoutine的类。该类是否也符合 NSCoder? -
Ohhhh 好的,所以任何和所有子类都必须符合并具有编码/解码功能?谢谢!
-
WorkoutRoutine NSCoding 是否兼容?