【问题标题】:Is it possible to use CKRecord.encodeSystemFields with JSONEncoder是否可以将 CKRecord.encodeSystemFields 与 JSONEncoder 一起使用
【发布时间】:2018-08-11 01:24:32
【问题描述】:

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

不幸的是,尽管Data 是可编码的,但在有效的 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 无关紧要。我得到了相同的结果。

【问题讨论】:

    标签: ios json swift cloudkit foundation


    【解决方案1】:

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

    这是一个工作场所:

    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)
    

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 2016-04-01
      • 2011-01-20
      • 2021-08-05
      • 2019-03-18
      • 2014-03-15
      • 2021-03-31
      • 2020-12-22
      • 2018-09-05
      相关资源
      最近更新 更多