gpt4 book ai didi

nskeyedarchiver - 如何替换 NSKeyedArchiver 的初始化程序 init(forWritingWith :) in iOS 12 to encode the metadata of a CKRecord

转载 作者:行者123 更新时间:2023-12-04 13:36:21 24 4
gpt4 key购买 nike

在 iOS 12 中,NSKeyedArchiver 的初始化程序 init(forWritingWith:) 已被弃用。 Xcode 10 建议用新的初始化程序 init(requiringSecureCoding:) 替换它。问题是这个初始化器只设置了 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(requiringSecureCoding:) 初始化程序替换 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 = true
record.encodeSystemFields(with: coder)
coder.finishEncoding()

你会写
let coder = NSKeyedArchiver(requiringSecureCoding: true)
record.encodeSystemFields(with: coder)
let data = coder.encodedData

手动分配给 .requiresSecureCoding和手册 finishEncoding() call 都不再需要了。

请注意,只有在调用 CKRecord.encodeSystemFields(with:) 时才需要这种舞蹈。 ,它明确地采用 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

关于nskeyedarchiver - 如何替换 NSKeyedArchiver 的初始化程序 init(forWritingWith :) in iOS 12 to encode the metadata of a CKRecord,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51372551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com