我试图传递一批“员工”#39;通过序列化数组将iPhone对象Apple Watch:
NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:employees];
并在Watch侧进行反序列化:
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
我是否必须在Watch端进行任何更改才能修复此错误?
答案 0 :(得分:33)
所以我只是遇到了同样的问题,答案很简单,但有点难以自己找到。
您只需使用:
NSKeyedArchiver.setClassName("Employee", for: Employee.self)
NSKeyedUnarchiver.setClass(Employee.self, forClassName: "Employee")
在任何需要的地方。
看起来iOS扩展名在类名前面加上扩展名。
答案 1 :(得分:5)
对我来说,这发生在我的Today扩展中。修正了在声明之前添加 @objc(MyExampleClass)的问题。
@objc(MyExampleClass)
open class MyExampleClass {
....
}
答案 2 :(得分:1)
最终我发现了这个问题: Added a custom framework, now Swift can't unarchive data,用户answered himself:
将
DemoNote
从应用程序移动到框架确实更改了模块名称,这意味着由于名称不匹配,NSKeyedUnarchiver
无法找到已归档类的实例。
他将旧项目名称加前缀为className
字符串的解决方案(例如,如果项目被称为"CompanyDirectory"
然后使用"CompanyDirectory.Employee"
而不是"Employee"
)是什么我需要能够从我的模型中取消归档我的数据,这些数据已被移植到新创建的链接框架中。