2012-02-15 3 views
3

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

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

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

ответ

7

Взгляните на KVO (наблюдение за ключевыми значениями): Key-Value Observing Programming Guide. Это стандартный способ сделать это в Cocoa, и это фундаментальная технология, которую вам нужно понимать, чтобы быть хорошим программистом Cocoa.

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

Соответствующие методы заключаются в следующем:

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

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

EDIT НИЖЕ:

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

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

+0

Если я это правильно понимаю, тогда будет наблюдаться функцияValueForKeyPath ... при изменении учетной записи - не только при ее сохранении. Наверное, я должен был быть более конкретным, что я хочу знать, когда он фактически сохранен в магазине. Кроме того, возможно, у меня есть вторая проблема, которая не совсем понимает, когда/как сохранять изменения. Несмотря на то, что я изменяю значение учетной записи своего Config, она не изменяется до тех пор, пока она не будет сохранена. Возможно, изменение и сохранение должны произойти во втором контексте, а затем быть объединены в основной контекст приложения. Это все еще для меня ново, но спасибо. – Brian

+0

Я добавил дополнительную информацию - спасибо вам за помощь. – Brian

+0

Я до сих пор не понимаю, почему вы хотите получать уведомления только об этом, а не при изменении активной учетной записи. Однако, поскольку в приложении, по-видимому, есть только один объект Config, достаточно легко отслеживать изменения в нем в вашем контроллере приложений (или когда это когда-либо имеет наибольшее значение) и отправлять уведомление в NSManagedObjectContextDidSaveNotification объекта управляемого объекта, если активная учетная запись с момента последнего сохранения. –

Смежные вопросы