我想使用NSUbiquitousKeyValueStore在iCloud中存储一些简单的键值对,用于我正在制作的游戏。我的印象是,如果用户删除,然后重新安装游戏,他们的进步将恢复时,应用程序启动。
情况似乎并非如此。根据我所做的测试,在应用程序的第一次发布时,从iCloud下载键值对需要很长时间。之后,这些数据似乎几乎立即就被上传和下载了。这会给我的应用程序带来问题,因为当它重新安装时,它不会立即拥有用户以前的数据,并创建一个新的数据集,从而否定了使用NSUbiquitousKeyValueStore的意义。
是否有办法确保NSUbiquitousKeyValueStore的信息在应用程序第一次发布后尽快可用,如果不是,我还可以使用什么其他iCloud API?
发布于 2020-02-04 21:28:19
为了确保在应用程序第一次发布后,NSUbiquitousKeyValueStore提供的信息能够尽快获得。你需要做两个步骤。
NSUbiquitousKeyValueStoreDidChangeExternallyNotification通知。NSUbiquitousKeyValueStore.default.synchronize()调用此方法的推荐时间是在应用程序启动或返回到前台时。例如:-
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(ubiquitousKeyValueStoreDidChange), name: NSUbiquitousKeyValueStore.didChangeExternallyNotification, object: NSUbiquitousKeyValueStore.default)
NSUbiquitousKeyValueStore.default.synchronize()
// referesh and retrieve keys
}
@objc func ubiquitousKeyValueStoreDidChange(notification:Notification) {
// Get the reason for keys changed
let changeReason = notification.userInfo![NSUbiquitousKeyValueStoreChangeReasonKey] as! Int
// get keys changed.
let changeKeys = notification.userInfo![NSUbiquitousKeyValueStoreChangedKeysKey] as! [String]
switch changeReason {
case NSUbiquitousKeyValueStoreInitialSyncChange, NSUbiquitousKeyValueStoreServerChange, NSUbiquitousKeyValueStoreAccountChange:
// referesh and retrieve keys
case NSUbiquitousKeyValueStoreQuotaViolationChange:
// Reduce Data Stored
}
}注意:所有类型的iCloud存储,例如,NSUbiquitousKeyValueStore只提供最终的一致性,因此不支持即时多设备访问。
https://stackoverflow.com/questions/48180256
复制相似问题