gpt4 book ai didi

ios - 是否可以将 CKRecord.encodeSystemFields 与 JSONEncoder 一起使用

转载 作者:行者123 更新时间:2023-11-28 06:02:53 27 4
gpt4 key购买 nike

我在“How (and when) do I use iCloud's encodeSystemFields method on CKRecord?”中看到如何使用 NSKeyedArchiver 缓存 CKRecord 的显着字段。有没有办法将 JSONEncoder 与 encodeSystemFields 一起使用?我的其他缓存数据保存为 JSON,所以我希望 encodeSystemFields 适合它。

不幸的是,尽管 Data 是 Codable,但在有效的 JSON 中是不允许的,并且没有通过 JSONSerialization.isValidJSONObject 测试,所以我不能只是阻塞 的输出NSKeyedArchiver 到我的 JSON 序列化中。

let d = Data()
d is Codable // true
// ...encodeSystemFields...
JSONSerialization.isValidJSONObject([d]) // false
let listofd = [d]
JSONSerialization.isValidJSONObject(listofd) // false
let dictofd = ["test":d]
JSONSerialization.isValidJSONObject(dictofd) // false

dData 还是NSMutableData 并不重要。我得到了相同的结果。

最佳答案

我找到的解决方案是首先使用 NSKeyedArchiver 序列化为 NSMutableData,将其转换为 Data,然后使用 JSONEncoder 再次将其编码为 JSON。它创建少于 2000 字节的 JSON。这压倒了我的小记录,但这就是生活。

这是一个工作的 Playground :

import Foundation
import CloudKit

let zoneID1 = CKRecordZoneID(zoneName: "Test.1",
ownerName: CKCurrentUserDefaultName)
let recID1 = CKRecordID(recordName: "Test1",
zoneID: zoneID1)
let rec1 = CKRecord(recordType: "Test",
recordID: recID1)

let cacheNSData = NSMutableData()
let kArchiver = NSKeyedArchiver(forWritingWith: cacheNSData)
rec1.encodeSystemFields(with: kArchiver)
kArchiver.finishEncoding()

cacheNSData.length
let cacheData = cacheNSData as Data

let jEncoder = JSONEncoder()

struct Cache: Codable {
var title: String
var blob: Data
}
let cacheItem = Cache(title: "abc", blob: cacheData)

let jData = try jEncoder.encode(cacheItem)
jData.count

String(data: jData, encoding: .utf8)

关于ios - 是否可以将 CKRecord.encodeSystemFields 与 JSONEncoder 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49075738/

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