NSUbiquitousKeyValueStore

NSUbiquitousKeyValueStore

我想使用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)仅提供最终的一致性,因此不支持即时的多设备访问。

    关于ios - NSUbiquitousKeyValueStore花费太长时间进行初始同步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48180256/

    10-12 03:19