Лучший способ реализовать обратимое удаление или архивирование с помощью Core Data и синхронизации с сервером

Я пытаюсь синхронизировать приложение iphone с веб-сервером, используя два флага: синхронизировано и is_deleted, как описано здесь https://stackoverflow.com/a/5052208

Когда пользователь удаляет элемент в приложении, я устанавливаю для флага is_deleted значение true. Теперь я хочу убедиться, что объект больше не отображается в моем приложении, поскольку он был удален (например, в виде таблицы), но мне нужно сохранить объект для выполнения синхронизации. Итак, вот вопрос:

Каков наилучший способ исключить все объекты с флагом is_deleted из отображения в приложении по умолчанию?

Сейчас я могу представить два варианта:

  1. Сделайте так, чтобы почти каждый запрос в приложении проверял, является ли элемент is_deleted - вообще не кажется очень эффективным

  2. Найдите более общий способ автоматического исключения всех объектов is_deleted=YES из приложения, например, переопределив awakeFromFetch или какой-либо другой метод. Но я не уверен, как исключить объекты из контекста, но сохранить их в базе данных для моей синхронизации.

Как лучше всего это сделать? Возможно ли вообще №2?


person farofeiro    schedule 06.03.2014    source источник


Ответы (2)


Я думаю, вы рассматриваете это для случая, когда пользователь хочет удалить некоторые объекты, но нет подключения к Интернету, верно? В этом случае я бы предложил фактически удалить эти объекты из базы данных и сохранить информацию об этих удаленных объектах в другой форме. Например, у вас может быть отдельный объект с именем «XXDelayedOperation», в котором будет вся необходимая информация для создания NSURLRequest. Это выглядит как более эффективный способ справиться с этим.

person dariaa    schedule 06.03.2014
comment
Я бы тоже пошел по этому пути. Вы можете либо сохранить идентификаторы удаленных объектов во внешнем списке (например, plist), либо даже добавить объект в свою модель для отслеживания удалений (например, DeletedObject). Когда объект удаляется, вы удаляете объект, но создаете запись DeletedObject с некоторым идентификатором. Позже вы сообщаете об этом серверу и удаляете запись DeletedObject. - person Drew McCormack; 07.03.2014
comment
Это вариант использования для большинства объектов, за исключением нескольких, которые пользователь сможет восстановить. Это выглядит чистым, поэтому, вероятно, мы пойдем с этим и будем использовать извлеченные предикаты, предложенные @greymouser для восстанавливаемых объектов. Спасибо! - person farofeiro; 08.03.2014

Вы ищете с помощью NSPredicate, верно? Просто пусть каждый синхронизируемый класс реализует предикат по умолчанию, который проверяет ваше состояние is_deleted, и добавляет к предикату специализацию для дальнейших запросов.

Также: не называйте это is_deleted. Подумайте о is_safe_deleted или safely_removed_and_not_called_is_deleted, потому что в первый раз, когда вы напишете [mo isDeleted], когда на самом деле имели в виду [mo is_deleted], у вас будут плохие времена.

person greymouser    schedule 06.03.2014
comment
Спасибо. Необходимость каждый раз добавлять предикат — это то, чего я пытаюсь избежать — также потому, что это делает все отношения, сгенерированные базовыми данными, бесполезными (т. е. user.messages будет возвращать удаленные сообщения). Хорошее замечание по поводу имени, вместо этого я фактически использовал архив, но имел в виду другой ответ о синхронизации. - person farofeiro; 06.03.2014
comment
Это именно то, чем является выбранное свойство — NSPredicate, встроенный в MOM для любого объекта. Core Data поможет вам спроектировать и разработать вашу модель... ваша модель включает в себя заархивированные элементы, поэтому я не уверен, что еще можно сделать. (Кроме того, я сам разработал нечто подобное.) - person greymouser; 06.03.2014