iPhone: Обновление просмотров с данными из сокета - PullRequest
1 голос
/ 01 февраля 2012

У меня есть:

  1. Делегат для обработки соединения с сокетом, который читает и записывает данные в сокет.

  2. A MyTableViewControllerс методами для заполнения таблицы в представлении данными, полученными из сокета.

Мой вопрос заключается в следующем:

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

Я подумал, что должен иметь один класс SocketClient для обработки всех сообщений, передаваемых через сокет, и затем уведомлять каждое соответствующееUIViewController.Но в этом случае, когда данные поступают в сокет, объект контроллера уже создан.Что привело меня к использованию контроллера в качестве синглтона.Это работает, но мне это не нравится.Альтернативой было бы для всех моих контроллеров быть делегатами, которые обрабатывают соединение с сокетом.Мне это тоже не нравится.

Каким будет ваш подход?

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012

Правильный подход здесь называется Model-View-Controller, и это основная архитектура во всем Какао. Модель хранит ваши данные (на время забудьте о сокете; таблицам все равно, откуда поступают данные). Представления (таблицы) отображают данные, а контроллеры (таблицы) соединяют их.

Таким образом, у вас будет набор объектов модели, содержащих данные. Они не заботятся о том, как данные отображаются, и их не волнует, откуда они берутся (сокет). Они просто хранят данные. Иногда ими управляет Singleton, иногда указатель на модель передается каждому контроллеру представления при создании контроллеров представления. Любой подход в порядке. Передача модели в контроллеры представления немного более гибкая, но требует немного больше кода.

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

Когда модель изменяется, контроллеры представления уведомляются. Это чаще всего обрабатывается с помощью NSNotification, но также может быть обработано с помощью KVO или делегирования.

0 голосов
/ 01 февраля 2012

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

@protocol SocketDelegate
- (void)socketHandler:(SocketHandler *)handler didReceiveData:(NSData *)data;
@end

Затем вы можете дать вашему экземпляру SocketHandler набор id<SocketDelegate> объектов (ваших контроллеров представления) и просто вызвать соответствующие методы делегата, чтобы уведомить каждый контроллер представления, когда обработчик получает данные. Я бы не думал о обработчике одноэлементного сокета как о «делегате», а скорее как о сетевом адаптере, который передает информацию ряду других классов.

...