我试图通过序列化数组将"Employee"对象数组iPhone传递给Apple Watch:
NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:employees];
并将其取消序列化为在观察方:
NSMutableArray *employees = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject];
这是"员工"类:
@interface Employee : NSManagedObject
@property (nonatomic, retain) NSNumber * employeeID;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * age;
@property (nonatomic, retain) NSString * address;
@property (nonatomic, retain) NSString * designation;
@property (nonatomic, retain) NSString * teamName;
@property (nonatomic, retain) NSString * gender;
@property (nonatomic, retain) NSNumber * dateOfJoining;
@end
我必须在手表一侧进行任何更改才能修复此错误吗?
所以我刚刚遇到了完全相同的问题,答案很简单,但自己很难找到。
您只需使用:
NSKeyedArchiver.setClassName("Employee", for: Employee.self)
在序列化之前NSKeyedUnarchiver.setClass(Employee.self, forClassName: "Employee")
在反序列化之前
在任何需要的地方。
看起来iOS扩展程序在类名前面加上了扩展程序的名称。
对我来说,这发生在我的Today扩展中。修复它的方法是在声明之前添加@objc(MyExampleClass)。
@objc(MyExampleClass)
open class MyExampleClass {
....
}
teriehina的回答让我走了一段路;我可以归档并取消归档以清理设备,但在尝试取消归档现有归档时仍然出现上述错误。
最终我发现了这个问题:添加了一个自定义框架,现在Swift可以';t用户自己回答的未归档数据:
将
DemoNote
从应用程序移动到框架确实更改了模块名称,这意味着NSKeyedUnarchiver
由于名称不匹配而找不到存档类的实例。
他将旧项目的名称前缀到className
字符串中的解决方案(例如,如果项目名为"CompanyDirectory"
,则使用"CompanyDirectory.Employee"
,而不是仅使用"Employee"
)是我能够从已移动到新创建的链接框架中的模型中取消配置数据所需要的。