Skip to content

Instantly share code, notes, and snippets.

@michaelnisi
Created September 9, 2018 04:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save michaelnisi/ac0c1242db9ddb940b93f8a32c39ccf7 to your computer and use it in GitHub Desktop.
Save michaelnisi/ac0c1242db9ddb940b93f8a32c39ccf7 to your computer and use it in GitHub Desktop.
Persisting Change Tokens for CloudKit Sync
// MARK: - Storing and Accessing Change Tokens
fileprivate extension UserDefaults {
fileprivate func setUUID(_ uuid: UUID, using key: String) {
self.set(uuid.uuidString, forKey: key)
}
fileprivate func uuid(matching key: String) -> UUID? {
guard let str = UserDefaults.standard.string(forKey: key) else {
os_log("** UUID not found: %@", log: log, key)
return nil
}
guard let uuid = UUID(uuidString: str) else {
os_log("** decoding UUID failed: %@",log: log, key)
return nil
}
return uuid
}
fileprivate func setServerChangeToken(_ token: CKServerChangeToken, using key: String) {
let coder = NSKeyedArchiver(requiringSecureCoding: true)
token.encode(with: coder)
self.set(coder.encodedData, forKey: key)
}
fileprivate func serverChangeToken(matching key: String) -> CKServerChangeToken? {
guard let data = UserDefaults.standard.object(forKey: key) as? Data else {
os_log("** server change token not found: %@", log: log, key)
return nil
}
do {
let coder = try NSKeyedUnarchiver(forReadingFrom: data)
coder.requiresSecureCoding = true
return CKServerChangeToken(coder: coder)
} catch {
os_log("** decoding server change token failed: ( %@, %@ )",
log: log, key, error as CVarArg)
return nil
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment