我想使用NSUbiquitousKeyValueStore
在iCloud
中存储一些我正在制作的游戏的简单键值对。我给人的印象是,如果用户删除然后重新安装了游戏,则在应用启动时将恢复其进度。
事实并非如此。根据我所做的测试,首次启动应用程序时,键值对需要很长时间才能从iCloud
下载。之后,数据似乎几乎可以立即上传和下载。这给我的应用程序带来了问题,因为重新安装该应用程序时,它不会立即为用户提供以前的数据,并且会创建一组新的数据,从而消除了使用NSUbiquitousKeyValueStore
的麻烦。
有没有一种方法可以确保在首次启动应用程序后尽快从NSUbiquitousKeyValueStore
中获取信息,如果不能,我可以使用哪些其他iCloud
API?
最佳答案
为了确保在首次启动该应用后尽快从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
)仅提供最终的一致性,因此不支持即时的多设备访问。关于ios - NSUbiquitousKeyValueStore花费太长时间进行初始同步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48180256/