Базовые данные NSManagedObject - отслеживание изменения атрибута - PullRequest
3 голосов
/ 15 февраля 2012

У меня есть объект - Config. Я хочу знать, изменился ли атрибут Account на Config. Когда это происходит, я хочу отправить NSNotification, чтобы знать весь код, который заботится о том, когда Account изменится. Моя первоначальная мысль была в моем подклассе NSManagedObject, что я переопределил бы метод setAccount, чтобы установить переходный атрибут AccountDidChange в true. Затем в didSave, если AccountDidChange было true, я отправил бы уведомление и затем установил его обратно на false. Есть ли способ лучше? Однако моя проблема заключается в том, что из прочитанного мной, изменив AccountDidChange обратно на false, я бы испортил свой объект и мне нужно было бы сохранить снова.

Немного больше информации: Объект Config является текущей конфигурацией приложения. Account действительно может быть изменено на ActiveAccount. Существует отношение к сущности Account, которая имеет список всех учетных записей. Идея заключается в том, что пользователь может изменить активную учетную запись приложения. Таким образом, у нас есть набор серверов, и пользователь может войти только на один сервер за раз. Config.Account указывает на эту активную учетную запись, и она используется для настройки соединений с сервером для получения информации. Я использую это уведомление, что Config.Account изменилось, чтобы сказать другим объектам очистить их информацию - например, список предупреждений. Как правило, вся информация относится к каждой учетной записи, поэтому ее необходимо удалить, а затем повторно загрузить при следующей загрузке с новой активной учетной записью.

Кроме того, указанные имена не являются моими фактическими именами объектов - я просто пытаюсь облегчить последующий пример.

1 Ответ

7 голосов
/ 15 февраля 2012

Взгляните на KVO (Наблюдение значения ключа): Руководство по программированию наблюдения значения ключа . Это стандартный способ сделать это в Какао, и это фундаментальная технология, которую вы должны понимать, чтобы быть хорошим программистом Какао.

KVO позволит объектам, которые заботятся об изменениях в свойстве Account (который вы, вероятно, следует назвать account, а не Account), получать уведомление при изменении свойства. KVO будет «просто работать» для стандартных NSManagedObjects, без каких-либо дополнительных действий с вашей стороны.

Соответствующие методы следующие:

  • -addObserver:forKeyPath:options:context:, который вы вызываете для своего объекта Config для настройки наблюдения
  • -observeValueForKeyPath:ofObject:change:context:, который будет вызываться на объекте-наблюдателе при каждом изменении наблюдаемого значения
  • -removeObserver:forKeyPath:, который вы должны убедиться, что звоните, когда наблюдателю больше не нужны уведомления об изменениях (в том числе до того, как наблюдатель будет освобожден).

Все это более подробно описано в связанной документации.

РЕДАКТИРОВАТЬ НИЖЕ:

Не зная ничего о вашем приложении, трудно понять, почему вы хотите получать уведомления только после сохранения. NSManagedObjectContext отправляет NSManagedObjectContextWillSaveNotification и NSManagedObjectContextDidSaveNotification. В userInfo уведомления есть массивы, содержащие вставленные, обновленные и удаленные объекты, но уведомления не так детализированы, как отдельные свойства. Я полагаю, вы могли бы вручную отслеживать изменения учетных записей между уведомлениями didSave. Это, вероятно, станет неэффективным, если в вашем магазине будет много Конфигов.

Изменения в NSManagedObjects являются немедленными, они просто не сохраняются в постоянном хранилище, пока вы не вызовете save: в контексте управляемого объекта. Возможно, если вы объясните больше о том, чего именно вы пытаетесь достичь и почему, я могу помочь вам лучше.

...