如何在Swift中使用Ensembles框架同步已删除的对象(使用Dropbox)

时间:2017-10-24 07:49:48

标签: swift core-data synchronization dropbox ensembles

我已经使用DropBox(API V2)在我的应用程序(Swift 3)中成功集成了Ensembles Framework。最初我使用过Icloud,但最后我更喜欢Dropbox。

Link to Ensembles on Github

同步有效但仅在我添加一些对象时才有效。 (我的对象是一些电影)

例如在模拟器中,如果在第一个设备中我添加了一部电影,那么在第二个设备上运行我的应用程序我可以在同步后看到该电影。

如果在第一台设备中我删除了一部电影,那么第二台设备上的电影就不会被删除,而且当我在第一台电影回来的设备上再次运行我的应用时。 所以我无法删除任何对象!

我想我做错了什么。

这是我删除电影时的代码:(我认为经典核心数据删除方法?)

 //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?()
                }
            }
        }

有没有人知道我的错误?

编辑:

由于我的物体之间的关系,这个问题是否会发生? (一对多,......)

当我创建一个关系时,我认为在ensembles框架中没有全局标识符?

全局标识符仅为实体设置,对吗? 用这种方法:

 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]
    }

提前谢谢。

1 个答案:

答案 0 :(得分:0)

我认为问题只是您正在使用批量删除。 Ensembles不支持批量操作,因为Ensembles无法观察保存更改。如果您使用标准删除,通过拍摄电影对象并在deleteObject:上调用NSManagedObjectContext,它将正确同步。