简体   繁体   English

如何编码/解码 [CKRecordZone.ID: CKServerChangeToken]?

[英]How to encode/decode [CKRecordZone.ID: CKServerChangeToken]?

public var zonesChangeToken: [CKRecordZone.ID: CKServerChangeToken]? {
        get {
            if(backingPreviousZonesChangeToken == nil) {
                guard let defaults: UserDefaults = UserDefaults(suiteName: CloudKitHandler.APP_GROUP_ID) else { return nil }
                guard let data = defaults.data(forKey: CloudKitHandler.CK_PREVIOUS_ZONES_CHANGE_TOKEN)
                    else { return [CKRecordZone.ID: CKServerChangeToken]() }
                do {
                    let unarchiver: NSKeyedUnarchiver = try NSKeyedUnarchiver(forReadingFrom: data)
                    unarchiver.requiresSecureCoding = true
                    backingPreviousZonesChangeToken = try unarchiver.decodeTopLevelObject() as? [CKRecordZone.ID: CKServerChangeToken]
                } catch { }
            }

            return backingPreviousZonesChangeToken
        }

        set(value) {
            backingPreviousZonesChangeToken = value
            guard let value = value else { return }
            guard let defaults: UserDefaults = UserDefaults(suiteName: CloudKitHandler.APP_GROUP_ID) else { return }
            let archiver: NSKeyedArchiver = NSKeyedArchiver(requiringSecureCoding: true)
            archiver.encode(value)
            archiver.finishEncoding()
            defaults.setValue(archiver.encodedData, forKey: CloudKitHandler.CK_PREVIOUS_ZONES_CHANGE_TOKEN)

        }
    }

I'm trying to encode/decode a dictionary of IDs and Tokens.我正在尝试编码/解码 ID 和令牌的字典。 But for some reason the decode always gives me a nil.但出于某种原因,解码总是给我一个零。

How to fix?怎么修?

extension CKServerChangeToken {
 func dataRepresentation() -> Data {
    let coder = NSKeyedArchiver.init(requiringSecureCoding: true)
    coder.requiresSecureCoding = true
    self.encode(with: coder)
    coder.finishEncoding()
    return coder.encodedData
 }

 class func token(data: Data) -> CKServerChangeToken? {
    do{
        let coder = try NSKeyedUnarchiver(forReadingFrom: data)
        coder.requiresSecureCoding = true
        let record = CKServerChangeToken(coder: coder)
        coder.finishDecoding()
        return record
    } catch {
        print(error)
    }
    return nil
 }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM