Переопределить создание экземпляров Interface Builder объектов? - PullRequest
0 голосов
/ 21 мая 2009

Я разрабатываю для iPhone, и у меня есть класс DataManager, который используется для хранения данных моего приложения. Когда приложение запускается / завершается, данные считываются / записываются на диск для создания экземпляра этого класса с использованием классов NSKeyedArchiver (и Unarchiver), поскольку DataManager придерживается протокола NSCoding.

Одна из проблем, с которыми я сталкиваюсь, заключается в том, что DataManager должен быть доступен для многих других моих классов IB, поэтому он определяется как объект в IB, и у этих классов есть выход. DataManager создается с использованием стандартного метода init: (или, возможно, initWithCoder :?), но, поскольку IB не имеет подходящего файла (или NSData из файла) для создания экземпляра объекта, он не имеет исходного содержимого.

Итак, есть ли способ сказать IB , а не , о создании экземпляра класса автоматически? Вместо этого это будет выполняться с использованием моего делегата приложения, что-то вроде:

AppDelegate.h

IBOutlet DataContext *context;

AppDelegate.m

context = [NSKeyedUnarchiver unarchiveObjectWithData:dataLoadedFromFile];

Как видите, это представляет проблему. Разве контекст не будет создан дважды, один раз InterfaceBuilder, затем второй раз моим делегатом приложения?

Я бы хотел предотвратить сохранение контекста в качестве ивара в делегате, так как это, похоже, отклоняется от парадигмы MVC и вместо этого склоняется к одноэлементному шаблону. (Контролер не должен нести ответственность за данные в моем уме. Он, очевидно, может поддерживать ссылку на них, но не должен отвечать за предложение их другим классам.)

1 Ответ

1 голос
/ 21 мая 2009

Когда приложение запускается / завершается, данные считываются / записываются на диск для создания экземпляра этого класса, используя классы NSKeyedArchiver (и Unarchiver), поскольку DataManager придерживается протокола NSCoding.

Одна проблема, с которой я сталкиваюсь, заключается в том, что мне нужно, чтобы DataManager был доступен для многих других моих классов IB, поэтому он определен как объект в IB ... Как вы можете видеть, это представляет проблему. Разве контекст не будет создан дважды, один раз InterfaceBuilder, затем второй раз моим делегатом приложения?

Да.

Сначала вы должны подумать, является ли это контроллером или модельным объектом. Мне кажется, что это контроллер.

Если это так, то вам следует переместить модель в отдельный объект или объекты и сделать их совместимыми с NSCoding, а также заставить менеджер данных загружать и сохранять эти объекты. Преимущество этого решения заключается в том, что вы можете указать менеджеру данных сохранять объекты и очищать их, когда вы получаете предупреждение о нехватке памяти, а не только во время завершения работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...