目前app本地持久化使用的是CoreData,编码的过程中遇到了自定义对象保存问题
以下是操作步骤 都是基于Xcode 自动创建NSManagedObject
-
定义对象 NSManagedObject 对象
- 其中timAuth字段是指向自定义对象的,type选择Transformable
- 选择timAuth字段,打开右侧更多编辑按钮,你会看到Transformer和Custom Class 让你填写
- Transformer 是你让填写转换的辅助类 以下是我工程中的代码,主要是继承ValueTransformer 然后实现以下四个方法。在图二中看看到Transformer填的是YYTimAuthValueTransformer
class YYTimAuthValueTransformer: ValueTransformer {
public override class func transformedValueClass() -> AnyClass {
return YYTimAuth.self
}
public override class func allowsReverseTransformation() -> Bool {
return true
}
public override func transformedValue(_ value: Any?) -> Any? {
guard value != nil else { return nil }
do {
return try NSKeyedArchiver.archivedData(withRootObject:value!,requiringSecureCoding:false)
} catch let error {
FKLog.c("错误信息:\(error)")
return nil
}
}
public override func reverseTransformedValue(_ value: Any?) -> Any? {
guard let data = value as? Data else {
return nil
}
do {
return try NSKeyedUnarchiver.unarchivedObject(ofClass: YYTimAuth.self, from: data)
} catch let error {
FKLog.c("错误信息:\(error)")
return nil
}
}
}
- 然后是要保持的自定义对象, 该类需要是继承NSObject,且实现了NSCoding协议
图二中Custom Class 我填的是 YYTimAuth
/// 腾讯im 鉴权相关
struct YYTimKey {
static let sign = "tim_sign"
static let userId = "user_id"
}
/// 腾讯im 鉴权相关
public class YYTimAuth:NSObject, NSCoding,YYJson {
var timSign: String?
var userId: String?
public func encode(with coder: NSCoder) {
coder.encode(timSign, forKey: YYTimKey.sign)
coder.encode(userId, forKey: YYTimKey.userId)
}
public required init?(coder: NSCoder) {
self.timSign = coder.decodeObject(forKey: YYTimKey.sign) as? String
self.userId = coder.decodeObject(forKey: YYTimKey.userId) as? String
}
}
- 以上都设置完后,你就可以直接使用自定义的对象了