Методы инициализации для объектов подкласса PFObject, сгенерированных Parse
Это отмечено iOS
, но я уверен, что это может быть полезно и для других Parse SDK. Как вы, наверное, знаете, в Parse добавлена возможность создавать нативные PFObject
подклассы к iOS
SDK не так давно. Это отличное дополнение по ряду причин. Во-первых, он позволяет компилятору проверять ваш код, создавая динамические свойства для атрибутов объекта:
myObject[@"myAttribute"]
преобразуется в myObject.myAttribute
Во-вторых, и что более важно для этого вопроса, пользовательские подклассы могут иметь дополнительную функциональность. Например, скажем, я создал приложение тревоги, которое хранит Alarm
объекты на облаке разбора. В моем собственном подклассе я могу переопределить + (instancetype)object
, - (void)saveEventually
, а также - (void)deleteEventually
методы, чтобы alarm
объект может запланировать / обновить / удалить UILocalNotification
для себя при создании, изменении или удалении.
Вот где все усложняется, и возникает мой реальный вопрос. Скажем, пользователь создает сигнал тревоги на одном устройстве (которое загружает его в облако), а затем автоматически синхронизирует его с другим устройством. Второе устройство, очевидно, обновляет свое содержимое в фоновом режиме с помощью PFQuery
"s - (BFTask *)findObjectsInBackground
а потом звонит - (BFTask *)fetchIfNecessaryInBackground
на каждом объекте, чтобы убедиться, что все его вещество находится на устройстве. Мой вопрос: какой метод (ы), если таковые имеются, вызывается, когда PFObject
подкласс найден / извлечен из облачной базы данных Parse? В этом отношении, как насчет объектов, инициализированных из локального хранилища данных?
Как я уже упоминал, переопределение различных методов прекрасно работает для объектов, которые создаются и управляются на устройстве, но я озадачен тем, как можно запускать пользовательский код из нового объекта, который только что поступил в память из локального или удаленного хранилища данных. Любые мысли или предложения о том, как справиться с этим, будет принята с благодарностью. Документация Parse не охватывает такой случай, так что, возможно, это даже не лучшая практика, но мне кажется, что так и должно быть. В любом случае, спасибо за ваше время и ваши идеи.
1 ответ
Что касается большинства подклассов NSObject
, путь, вероятно, переопределить -init
метод.
Однако, как вы упомянули в своем последнем абзаце, такая практика недокументирована, и вам, вероятно, следует избегать ее. Путь PFObjects
работа позволяет иметь несколько экземпляров одного и того же объекта в памяти (несколько PFObjects
с тем же objectId
). И вы не контролируете, когда и почему эти объекты создаются, поэтому полагаться на код, выполняемый при их инициализации, вероятно, плохая идея. Если вы использовали Core Data, обратите внимание, что Parse действительно обрабатывает вещи по-другому, поэтому лучшие практики отличаются.
Например, я не говорю, что это так, но что, если копия каждого объекта создается перед сохранением? Что делать, если объект создается дважды при выполнении запроса с политикой "кеш, затем сеть"? Даже если вы заставите это работать, у вас все равно будет что-то, что может сломаться при каждом обновлении Framework.
Я думаю, что вы должны связать свой код инициализации в свой собственный метод, который вы бы называли для себя объектами, когда получаете их из запроса или из локального хранилища данных. Переопределение - это хороший дизайн и практика в объектно-ориентированном программировании, но есть некоторые исключения, и я думаю, что это одно из них.