NSUbiquitousKeyValueStore 初始同步时间过长

NSUbiquitousKeyValueStore taking too long for initial sync

我想使用 NSUbiquitousKeyValueStoreiCloud 中存储一些我正在制作的游戏的简单键值对。我的印象是,如果用户删除并重新安装游戏,他们的进度会在应用启动时恢复。

这似乎并非如此。根据我所做的测试,键值对在应用程序首次启动时需要很长时间才能从 iCloud 下载。在那之后,数据似乎几乎是立即上传和下载的。这会导致我的应用程序出现问题,因为当它重新安装时,它不会立即拥有用户以前的数据并创建一组新数据,从而否定了使用 NSUbiquitousKeyValueStore.

的意义

有没有办法确保 NSUbiquitousKeyValueStore 的信息在应用程序首次启动后尽快可用,如果不能,我可以使用哪些其他 iCloud API?

确保 NSUbiquitousKeyValueStore 中的信息在应用程序首次启动后尽快可用。您需要执行两个步骤。

  • 第 1 步:- 注册 NSUbiquitousKeyValueStoreDidChangeExternallyNotification 应用程序启动期间的通知。

  • 第 2 步:- 调用实例方法
    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 仅提供最终一致性,因此不支持即时多设备访问。