作者:黑马@梦想 | 来源:互联网 | 2022-12-10 14:31
如何解决《如何在iOS12中替换NSKeyedArchiver的初始化程序init(forWritingWith:)来编码CKRecord的元数据》经验,为你挑选了1个好方法。
在iOS 12中,不推荐使用NSKeyedArchiver的初始化程序init(forWritingWith :).Xcode 10建议用新的初始化程序init(需要SecureCoding :)替换它.问题是此初始化程序仅设置NSCoder对象的requiresSecureCoding属性的值,但它不设置将包含编码数据的NSMutableData对象.以下是Apple提出的编码CKRecord元数据(CloudKit记录)的原始代码:
let data = NSMutableData()
let coder = NSKeyedArchiver.init(forWritingWith: data)
coder.requiresSecureCoding = true
record.encodeSystemFields(with: coder)
coder.finishEncoding()
CKRecord类的encodeSystemFields方法需要NSKeyedArchiver对象(NSCoder子类),并且编码数据存储在与此对象关联的NSMutableData对象中.如果我用init(requiresSecureCoding :)初始化程序替换init(forWritingWith :)初始化程序,我得到一个NSKeyedArchiver对象,但是这个对象没有与任何NSMutableData对象关联,因此我没有得到记录的元数据.我不确定如何完成代码以将NSKeyedArchiver对象生成的数据转换为NSMutableData对象.
1> Itai Ferber..:
对于一些版本,现在NSKeyedArchiver
有一个encodedData
方法可以调用-finishEncoding
归档器并返回归档器已创建的最终编码数据.这是通过-[NSKeyedArchiver init]
以下方式初始化时获取完成数据的方式:
let coder = NSKeyedArchiver()
/* encode stuff */
let data = coder.encodedData
这消除了对NSMutableData
变体的需求,并且通过此更新,可变数据变体已被弃用,有利于更新的范例.所以而不是写作
let data = NSMutableData()
let coder = NSKeyedArchiver.init(forWritingWith: data)
coder.requiresSecureCoding = true
record.encodeSystemFields(with: coder)
coder.finishEncoding()
你会写的
let coder = NSKeyedArchiver(requiringSecureCoding: true)
record.encodeSystemFields(with: coder)
let data = coder.encodedData
不再需要手动分配.requiresSecureCoding
和手动finishEncoding()
呼叫.
请注意,这种舞蹈只在调用时才需要CKRecord.encodeSystemFields(with:)
,它NSCoder
只是为了仅编码自身的一个子集而明确地进行.在编码对象的一般情况下,您将使用新NSKeyedArchiver.archivedData(withRootObject:requiringSecureCoding:)
方法:
let data = try NSKeyedArchiver.archivedData(withRootObject: /* object */, requiringSecureCoding: true)
这相当于
let coder = NSKeyedArchiver(requiringSecureCoding: true)
coder.encodeObject(/* object */, forKey: NSKeyedArchiveRootObjectKey)
let data = coder.encodedData