从 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 同步的主要内容,如果未能解决你的问题,请参考以下文章