Как синхронизировать удаленный объект с Ensembles Framework в Swift (с Dropbox)

71
3

Я успешно объединил Ensembles Framework в своем приложении (Swift 3) с DropBox (API V2). Первоначально я использовал 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]
}

Заранее спасибо.

спросил(а) 2017-10-24T10:49:00+03:00 3 года, 1 месяц назад
1
Решение
82

Я думаю, проблема в том, что вы используете пакетное удаление. Пакетные операции не поддерживаются ансамблями, потому что ансамбли не могут наблюдать изменения сохранения. Если вы используете стандартное удаление, взяв объект фильма и вызывая deleteObject: в NSManagedObjectContext, он будет синхронизироваться правильно.

ответил(а) 2017-10-25T18:02:00+03:00 3 года, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема