我已成功将 Ensembles Framework 与 DropBox (API V2) 集成到我的应用程序 (Swift 3) 中。最初我使用的是 Icloud,但最终我更喜欢 Dropbox。
同步有效,但前提是我添加了一些对象。 (我的对象是一些电影)
例如,在模拟器中,如果我在第一台设备中添加电影,然后在第二台设备上运行我的应用程序,我可以在同步后看到该电影。
但是如果我在第一台设备中删除了一部电影,那么该电影不会在第二台设备上删除,并且当我在第一台设备上再次运行我的应用程序时,该电影会回来。 所以我无法删除任何对象!
我想我做错了什么。
这是我删除电影时的代码:(我认为经典的核心数据删除方法?)
//Delete a movie
class func EffacerTitreDansBaseFilmsViaID(IdFilm:Int32){
let fetchRequest:NSFetchRequest <BaseFilms> = BaseFilms.fetchRequest()
let predicate = NSPredicate(format: "id = %d",IdFilm)
fetchRequest.predicate=predicate
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest as! NSFetchRequest<NSFetchRequestResult>)
do {
try managedObjectContext.execute(deleteRequest)
}catch{
print(error.localizedDescription)
}
//I also save again the context:(Just to be sure...)
do {
try managedObjectContext.save()
} catch {
print(error.localizedDescription)
}
}
这是我的 AppDelegate 中的两个观察者:
// Listen for local saves, and trigger merges
NotificationCenter.default.addObserver(self, selector:#selector(self.localSaveOccurred(_:)), name:NSNotification.Name.CDEMonitoredManagedObjectContextDidSave, object:nil)
NotificationCenter.default.addObserver(self, selector:#selector(self.cloudDataDidDownload(_:)), name:NSNotification.Name.CDEICloudFileSystemDidDownloadFiles, object:nil)
以及相关的功能:
func localSaveOccurred(_ notif: Notification) {
self.synchroniseCloudDatas(nil)
}
func cloudDataDidDownload(_ notif: Notification) {
self.synchroniseCloudDatas(nil)
}
以及同步功能:
func synchroniseCloudDatas(_ completion: (() -> Void)?) {
if !ensemble.isLeeched {
ensemble.leechPersistentStore {
error in
completion?()
}
}
else {
ensemble.merge {
error in
completion?()
}
}
}
有人知道我的错误吗?
编辑:
这个问题是否是由于我的对象之间的关系而发生的? (一对多,...)
当我创建关系时,我认为集成框架中没有全局标识符?
全局标识符仅为实体设置,对吗? 使用此方法:
func persistentStoreEnsemble(_ ensemble: CDEPersistentStoreEnsemble!, globalIdentifiersForManagedObjects objects: [Any]!) -> [Any]! {
print("%@", (objects as NSArray).value(forKeyPath: "uuid") as! [AnyObject])
return (objects as NSArray).value(forKeyPath: "uuid") as! [AnyObject]
}
提前谢谢您。
最佳答案
我认为问题很简单,您正在使用批量删除。 Ensemble 不支持批量操作,因为 Ensemble 无法观察保存更改。如果您使用标准删除,通过获取影片对象并在 NSManagedObjectContext
上调用 deleteObject:
,它将正确同步。
关于swift - 如何在 Swift 中将已删除的对象与 Ensembles Framework 同步(使用 Dropbox),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46904984/