从 iCloud 同步

Posted

技术标签:

【中文标题】从 iCloud 同步【英文标题】:Synchronization from iCloud 【发布时间】:2017-11-19 16:45:41 【问题描述】:

我试图证明信息存储在 iCloud 中的工作原理。我从 Userdefaults 开始。我做了一些简单的事情,一个表格,我添加了一个文本,我将它保存在 Userdefaults 的一个数组中,并将它与云同步。如果我把它放在两台设备上,当我启动第二台设备(使用相同的 iCloud 用户)时,它会使用我放入第一台设备的数据进行更新。但是,如果我添加另一个元素,它会保存在云中,但不会通知第二个设备来更新它。如果我关闭第二个并重新打开它,它会获取更改。我试图将通知放在 AppDelegate 和直接在控制器中,结果相同。 我用于 Userdefaults 的类:

class UserDef: NSObject 
let def = UserDefaults.standard
let store = NSUbiquitousKeyValueStore()
static var kName = "nombre"
static var kArray = "array"

var delegate: ViewController?

public func setArray(arr:[String], update: Bool = true) 
    def.set(arr, forKey: UserDef.kArray)
    if update == true 
        //guardo en la nube
        store.set(arr, forKey: UserDef.kArray)
        store.synchronize()
    


public func getArray() -> [String] 
    if let a = def.object(forKey: UserDef.kArray) as? [String] 
        return a
     else 
        return []
    


public func newCloudArray(array: [String]) 
//me pasan el array del cloud
    self.setArray(arr: array, update: false)   
    self.delegate?.reload()


在Appdelegate中我放了这个,一开始就收集了:

var store = NSUbiquitousKeyValueStore.default

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
    NotificationCenter.default.addObserver(self, selector: #selector(ubiquitousKeyValueStoreDidChange), name: NSUbiquitousKeyValueStore.didChangeExternallyNotification, object: store)
    store.synchronize()
    return true


@objc public func ubiquitousKeyValueStoreDidChange(notification: NSNotification) 
    let a = store.array(forKey: "array") as! [String]
    UserDef().newCloudArray(array: a)


我了解,如果我从另一台设备更新 iCloud,我应该收到通知 didChangeExternallyNotification 并从那里收集数据并更新 Userdefaults,但我什么也没收到。

感谢您的帮助

【问题讨论】:

【参考方案1】:

iCloud 键值数据存储仅提供最终一致性。 因此,一个设备中的更改最终会在未来某个时间出现在另一台设备上。因此推荐来自Apple Documentation

避免使用键值存储来存储对您的应用至关重要的数据 离线时的行为;相反,将此类数据直接存储到 本地用户默认数据库。

【讨论】:

以上是关于从 iCloud 同步的主要内容,如果未能解决你的问题,请参考以下文章

手动同步 iCloud

iCloud 不使用临时配置文件同步

何时最好执行 iCloud 同步

使用 iCloud 进行核心数据同步

在应用升级期间避免 iCloud 同步上的重复数据

从 iCloud 文件中取消归档对象时出错