Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否可以将CKRecord.encodeSystemFields与JSONEncoder一起使用_Ios_Json_Swift_Cloudkit_Foundation - Fatal编程技术网

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

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

我在“”中看到了如何使用NSKeyedArchiver缓存CKRecord的显著字段。有没有办法将JSONECODER与
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)