如何在iOS 12中替换NSKeyedArchiver的初始化程序init(forWritingWith :)来编码CKRecord的元数据

如何在iOS 12中替换NSKeyedArchiver的初始化程序init(forWritingWith :)来编码CKRecord的元数据,第1张

概述在iOS 12中,不推荐使用NSKeyedArchiver的初始化程序init(forWritingWith :). Xcode 10建议用新的初始化程序init(需要SecureCoding :)替换它.问题是此初始化程序仅设置NSCoder对象的requiresSecureCoding属性的值,但它不设置将包含编码数据的NSMutableData对象.以下是Apple提出的编码CKRecord 在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 = truerecord.encodeSystemFIElds(with: coder)coder.finishEnCoding()

CKRecord类的encodeSystemFIElds方法需要NSKeyedArchiver对象(NSCoder子类),编码数据存储在与此对象关联的NSMutableData对象中.如果我用init(requiresSecureCoding :)初始化程序替换init(forWritingWith :)初始化程序,我得到一个NSKeyedArchiver对象,但是这个对象没有与任何NSMutableData对象关联,因此我没有得到记录的元数据.我不确定如何完成代码以将NSKeyedArchiver对象生成的数据转换为NSMutableData对象.

解决方法 对于一些版本,现在NSKeyedArchiver有一个 encodedData method,它在归档器上调用-finishEnCoding并返回归档器创建的最终编码数据.这是通过 – [NSKeyedArchiver init]初始化时获取完成数据的方式:

let coder = NSKeyedArchiver()/* encode stuff */let data = coder.encodedData

这消除了对NSMutableData变体的需求,并且通过此更新,不推荐使用可变数据变体,这有利于更新的范例.所以而不是写作

let data = NSMutableData()let coder = NSKeyedArchiver.init(forWritingWith: data)coder.requiresSecureCoding = truerecord.encodeSystemFIElds(with: coder)coder.finishEnCoding()

你会写的

let coder = NSKeyedArchiver(requiringSecureCoding: true)record.encodeSystemFIElds(with: coder)let data = coder.encodedData

不再需要手动分配.requiresSecureCoding和手动finishEnCoding()调用.

请注意,只有在调用CKRecord.encodeSystemFIElds(带:)时才需要这种舞蹈,它显式地接受NSCoder以便仅编码自身的子集.在编码对象的一般情况下,您将使用the new NSKeyedArchiver.archivedData(withRootObject:requiringSecureCoding:) method:

let data = try NSKeyedArchiver.archivedData(withRootObject: /* object */,requiringSecureCoding: true)

这相当于

let coder = NSKeyedArchiver(requiringSecureCoding: true)coder.encodeObject(/* object */,forKey: NSKeyedArchiveRootObjectKey)let data = coder.encodedData
总结

以上是内存溢出为你收集整理的如何在iOS 12中替换NSKeyedArchiver的初始化程序init(forWritingWith :)来编码CKRecord的元数据全部内容,希望文章能够帮你解决如何在iOS 12中替换NSKeyedArchiver的初始化程序init(forWritingWith :)来编码CKRecord的元数据所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1078115.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存