swift - 如何在 Swift 中将已删除的对象与 Ensembles Framework 同步(使用 Dropbox)

标签 swift core-data synchronization dropbox ensembles

我已成功将 Ensembles Framework 与 DropBox (API V2) 集成到我的应用程序 (Swift 3) 中。最初我使用的是 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?()
                }
            }
        }

有人知道我的错误吗?

编辑:

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

当我创建关系时,我认为集成框架中没有全局标识符?

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

 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/

相关文章:

ios - 删除字符串中所有两次重复字符的方法

uitableview - NSFetchedResultsController - 谓词的运行时变量更改

ios - 修改 NSFetchRequest 生成 NSRangeException 索引 0 超出空数组的范围

iphone - nsfetchedresultscontroller 中部分名称键路径的无关系值

c++ - 在 C++ 中使用互斥锁和条件变量实现带信号的监视器

ios - UserDefaults 可以在每次 .synchronize() 之后继续保存新数据吗?

multithreading - 使用多线程算法进行交通路口模拟

swift - 转换为字符串任意值

swift - 如何使 PageControl 显示两行

ios - 获取和设置变量有什么意义?