Сохранение источника данных между несколькими представлениями без общего корневого контроллера представления - PullRequest
0 голосов
/ 02 декабря 2010

Я сейчас работаю над приложением, которое использует UINavigationController внутри UITabBars. Панели вкладок соответствуют как UITableViews, так и представлению карты. Однако корневой контроллер представления приложения не является родителем или прямым родителем пользовательских контроллеров UITableView и контроллера представления карты. У меня также есть p-список, который создает NSDictionary объектов; это источник данных, который я использую для заполнения записей в таблицах и на карте.

Итак, без корневого контроллера представления, как мне создать NSDictionary объекты из источника данных? Мне кажется, что самый простой способ - просто воссоздать объект в каждом контроллере представления для представления, которому нужны данные. Поскольку у меня не так много просмотров, а p-список не такой длинный, проблема с памятью не должна быть. Однако я знаю, что все это очень неэффективно.

Есть ли альтернативная реализация, чтобы мне не нужно было воссоздавать NSDictionary в каждом контроллере представления?


В этом уроке, содержащем руководство по работе с одиночками, все понятно: http://www.cocoanetics.com/2009/05/the-death-of-global-variables/

Теперь меня беспокоит только то, что, если каждый контроллер представления вызывает один синглтон, разве они не будут генерировать несколько экземпляров NSDictionary, и не может ли это по-прежнему занимать много памяти?

Ответы [ 3 ]

2 голосов
/ 02 декабря 2010

Вам необходим объект модели данных, в котором хранятся данные для приложения.

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

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

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

Быстрый и грязный способ создания модели данных - это добавить атрибуты.делегату приложения, а затем вызовите делегата приложения из контроллеров представления, используя:

MyAppDelegateClass *appDelegate=[[UIApplication sharedApplicaton] delegate];
myLocalProperty=appDelegate.someDataModelProperty;

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

Размещение данных в методе init или viewDidLoad не будет работать, поскольку на панели вкладок пользователи могут переключаться назад и вперед без выгрузки представления или повторной инициализации контроллера представления.

Лучшее место дляПолучить измененные данные в методе контроллера viewWillAppear.Таким образом, данные будут обновляться каждый раз, когда пользователь переключается на эту вкладку.

0 голосов
/ 03 декабря 2010

На практике модель данных обычно либо помещается в какой-то одноэлементный элемент (либо ваш собственный, либо делегат приложения, который является своего рода одноэлементным).

0 голосов
/ 02 декабря 2010

Вы должны прочитать об архитектуре Model-View-Controller (MVC).В частности, вы, вероятно, захотите представить модель данных, в которой вы будете создавать и заполнять словарь во время инициализации, а затем получать к нему доступ со всех ваших контроллеров представления.

...