2013-02-18 5 views
2

В качестве части моего решения синхронизации я использую sync status для всех объектов определенного класса. Всякий раз, когда изменяются определенные (не все) атрибуты этого объекта, я хочу обновить статус.Обновление флага при изменении атрибута

Я рассматриваю четыре подхода:

  1. установки статуса в коде вручную, куда бы я изменить то, что нужно, чтобы синхронизироваться. Это наиболее очевидно, но также и самый трудоемкий и подверженный ошибкам (мне нужно будет также помнить о том, чтобы обновлять статус синхронизации каждый раз, когда добавляю новые функции).
  2. Отслеживайте его с помощью уведомления о сердечнике (например, willSave или NSManagedObjectContextObjectsDidChangeNotification). Это кажется наиболее подходящим на первый взгляд - Я просто подписываюсь на уведомления в своем AppDelegate и обновляю статус . Но можно ли просмотреть изменения и обновить статус синхронизации только тогда, когда меня интересует атрибут ? Кроме того, не будет установлено , а также sync_status также вызывает это уведомление, ведущее меня в бесконечный цикл? Как я могу это ответить?
  3. Пользовательские сеттеры по атрибутам, которые меня волнуют. У меня было проблема с попыткой получить эту работу до этого, и в итоге решил , чтобы попытаться оставить стандартные базовые данные для получения/установки. Но я, , вернусь, если он лучше всего подходит.
  4. KVO. Я раньше не использовал этот шаблон, но может быть проще всего просто зарегистрируйтесь для уведомлений об изменениях атрибутов для тех, кого интересует и установите там флаг. Но где я могу это сделать? Мне нужно, чтобы контролировал каждый объект класса, так можно было бы начать наблюдать за уведомлениями KVO атрибутов в том же объекте ? I.e., всякий раз, когда создается объект, сразу же тот же объект слушает изменения атрибута А и устанавливает его собственный sync_status когда он срабатывает?

Какой из этих подходов будет служить мне лучше всего? Возможно, мне не хватает других идей?

+0

еще один пример будет протоколом для уведомления получателя о любых изменениях. Вы можете использовать словарь для передачи соответствующих данных? – katzenhut

ответ

2

Ручная настройка кода состояния

Вероятно, плохая идея, именно по той причине, вы описываете. Вам нужно будет сделать это во всех случаях. Вы не всегда можете быть разработчиком приложения. Однажды вы или кто-то еще забудете это. Даже если вы этого не сделаете, вы получите дополнительный код повсюду, который может быть централизован.

Отслеживать его с помощью уведомления о сердечных данных [...] Кроме того, не будет ли установка sync_status также срабатывает для этого уведомления, что приведет меня в бесконечный цикл?

Это зависит от того, как вы это делаете. Прослушивание NSManagedObjectContextDidSaveNotification может работать, если вы используете дополнительный NSManagedObjectContext. Таким образом вы можете установить флаг синхронизации, сохранить изменения и избежать цикла, потому что вы сохраняете другой контекст, который вы не наблюдаете.

Использование NSManagedObjectContextObjectsDidChangeNotification также может работать.Это будет опубликовано, когда свойства объекта будут изменены, но сохранение пока еще не выполняется. Осмотрите словарь userInfo, чтобы узнать, изменилось ли что-либо, о чем вы заботитесь, и если да, установите флаг sync_status. Установка флага вызовет новое уведомление, но это будет то, о чем вам неинтересно, поэтому вы нарушите цикл. Использование отдельного контекста также предотвратит цикл.

Пользовательские сеттеры по атрибутам, которые меня волнуют.

Определенно работоспособный, хотя в зависимости от того, сколько атрибутов вам небезразлично, вы можете получить множество аксессуаров только для обновления статуса синхронизации. Из четырех вы упомянули, что я буду использовать.

Связанный, но более простой подход заключается в переопределении willSave на классы управляемого объекта. Это будет вызвано непосредственно перед сохранением. Внесите его в

  1. Просмотрите [self changedValues] для атрибутов, которые вызывают синхронизацию.
  2. Установите флаг синхронизации, если вы найдете любой из них.

Таким образом, у вас есть только один настраиваемый метод для каждого объекта, независимо от того, сколько атрибутов в конечном итоге запускает флаг синхронизации.

KVO

Должно работать, но, вероятно, менее интуитивным, чтобы получить работу прямо, чем пользовательские сеттеров.

Когда мне приходилось делать что-то подобное, я помещал информацию синхронизации за пределы моего хранилища данных. Я бы слушать NSManagedObjectContextDidSaveNotification, и в методе наблюдателя, я бы:

  1. Посмотрите через userInfo, чтобы увидеть, что изменилось
  2. Получить NSManagedObjectID для каждого объекта, который нужно будет синхронизировать
  3. Преобразовать идентификаторы объектов в NSStrings и добавьте их в список, сохраненный в отдельном файле.

При успешной синхронизации я удалил список ID объекта.

Мысль состояла в основном в том, что флаг синхронизации представляет собой больше метаданных, чем фактические данные модели, поэтому я оставил его вне модели. Если вы предпочитаете держать его в модели, я бы пошел с переопределением willSave.

+0

Спасибо, Том. Я рассмотрю ваш внешний подход. Кажется наиболее масштабируемым, если и когда я хочу синхронизировать несколько типов объектов, и избегает необходимости фильтровать весь набор данных каждый раз, когда я хочу знать, что нужно синхронизировать. Вы также сохранили список объектов для синхронизации в основных данных? Или какой-то другой механизм? –

+0

Я поместил его в файл списка свойств, который был более чем достаточным для приложения. Преобразуйте каждый идентификатор управляемого объекта в NSString (через его URIRпредставление) и добавьте его в коллекцию. Мне нужно было обрабатывать вставки, обновления и удалять отдельно, поэтому я использовал словарь верхнего уровня с тремя ключами, где значениями были массивы идентификаторов объектов. –

+0

Вам приходилось определять в NSManagedObjectContextDidSaveNotification *, какие * атрибуты были изменены?Я не уверен, что смогу сделать это, так как userinfo в уведомлении содержит только вновь сохраненные значения. –