Ios 是否可以将CKRecord.encodeSystemFields与JSONEncoder一起使用
我在“”中看到了如何使用NSKeyedArchiver缓存CKRecord的显著字段。有没有办法将JSONECODER与Ios 是否可以将CKRecord.encodeSystemFields与JSONEncoder一起使用,ios,json,swift,cloudkit,foundation,Ios,Json,Swift,Cloudkit,Foundation,我在“”中看到了如何使用NSKeyedArchiver缓存CKRecord的显著字段。有没有办法将JSONECODER与encodeSystemFields一起使用?我的另一个缓存数据保存为JSON,因此我希望encodeSystemFields与之相适应 不幸的是,有效的JSON中不允许数据,尽管它是可编码的,并且没有通过测试JSONSerialization.isValidJSONObject,因此我不能将NSKeyedArchiver的输出阻塞到我的JSON序列化中 let d = Dat
encodeSystemFields
一起使用?我的另一个缓存数据保存为JSON,因此我希望encodeSystemFields
与之相适应
不幸的是,有效的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
无论
d
是Data
还是NSMutableData
。我得到了同样的结果。我找到的解决方案是首先使用NSKeyedArchiver将其序列化为NSMutableData,将其转换为Data,然后使用JSONeCoder将其再次编码为JSON。它创建的JSON少于2000字节。这压倒了我小小的记录,但这就是生活
这里有一个工作场地:
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)