如何存储PHPersistentChangeToken?NSUserDefaults存储失败求助
解决NSUserDefaults无法存储PHPersistentChangeToken的问题
问题场景
尝试直接用NSUserDefaults存储PHPersistentChangeToken时触发报错:
存储代码:
UserDefaults.standard.set(PHPhotoLibrary.shared().currentChangeToken, forKey: "token")
报错信息:
[User Defaults] Attempt to set a non-property-list object <PHPersistentChangeToken: 0x600000e69f40: persistentHistoryToken=<NSPersistentHistoryToken - { "3F642A05-50EB-4DB3-8C26-3554B5F25849" = 110; }>, version=1> as an NSUserDefaults/CFPreferences value for key token
原因
NSUserDefaults仅支持存储符合**属性列表(Property List)**规范的对象类型(NSString、NSNumber、NSDate、NSData、NSArray、NSDictionary),PHPersistentChangeToken不属于这类类型,无法直接存储。
正确的存储与读取方法
需要通过NSKeyedArchiver将token归档为Data,存入UserDefaults;读取时再用NSKeyedUnarchiver解档还原。
存储操作
if let token = PHPhotoLibrary.shared().currentChangeToken { do { let tokenData = try NSKeyedArchiver.archivedData(withRootObject: token, requiringSecureCoding: true) UserDefaults.standard.set(tokenData, forKey: "photoChangeToken") } catch { print("归档PHPersistentChangeToken失败:\(error.localizedDescription)") } }
读取操作
if let tokenData = UserDefaults.standard.data(forKey: "photoChangeToken") { do { guard let changeToken = try NSKeyedUnarchiver.unarchivedObject(ofClass: PHPersistentChangeToken.self, from: tokenData) else { print("解档得到的token为空") return } // 在这里使用还原后的changeToken处理照片库变更逻辑 } catch { print("解档PHPersistentChangeToken失败:\(error.localizedDescription)") } }
内容的提问来源于stack exchange,提问作者DNB5brims
相关产品推荐
相关产品推荐

