1

Я пытаюсь найти лучший способ реализовать проект MVC в своем приложении. Прямо сейчас, когда пользователь входит в UITableViewController, я отправляю запрос на мою модель, чтобы перейти в Интернет и загрузить некоторые данные. Когда данные возвращаются, я хочу, чтобы он обновлял данные, даже если мой UITableViewController освобожден (пользователь закрывает представление или отказывается от него). Поэтому в настоящее время я обновляю модель, а затем имею делегат на модели для «обновления пользовательского интерфейса» в UITableViewController. В основном после возвращения данных я хочу, чтобы модель вызывала [tableView reloadData], и я достигаю этого с помощью делегата.NSURLConnection MVC Best Practices

Мои вопросы:

  1. Это обязательно правильный путь? Есть ли другой способ для моей модели вызывать методы на моем UIViewController?

  2. Что делать, если несколько экземпляров ViewControllers будут уведомлены при изменении этой модели ... например, что если я вернусь из UITableViewController1, а затем перейдите в UITableViewController2 и эта же модель/данные будут использованы. Должен ли я просто создавать несколько делегатов на моей модели?

Просто ищите рекомендации и задаетесь вопросом, правильно ли я это делаю.

Заранее благодарен.

ответ

1

Вы можете использовать NSNotification, чтобы предупредить слушателей об изменениях, или Key-Value Observing (KVO). Оба являются ароматами Observer Pattern, которые помогут вам удалить сцепление с вашей модели на ваши виды и в качестве бонуса позволяют любому количеству наблюдателей узнавать об изменениях в вашей модели, не сообщая им все индивидуально.

Автоматическое и ручное уведомление об изменении. This explains the difference.

Я готов держать пари, вы могли бы сделать вручную уведомление, так что вы должны сделать следующее:

[self willChangeValueForKey:@"something"]; 
... // update 'something' here 
[self didChangeValueForKey:@"something"]; 

И наблюдатели будут получать уведомление. Автоматический метод требует использования методов атрибутов, которые вы, вероятно, не использовали бы внутренне. Обычно KVO применяется к одному атрибуту модели, конечно, в пределах модели, отправляющей уведомления, может быть много. Если вы делаете что-то большее по строкам «Я только что завершил процесс X», это скорее всего NSNotification.

+0

Для KVO после анализа данных XML из веб-запроса и изменения моей модели он автоматически уведомляет VC, которые регистрируются для уведомлений об изменениях? В то время, если модель представляет собой массив объектов, я мог бы вызвать tableView: insertRows: atIndexPaths? – VTS12

+0

Yikes ... Форматирование в комментариях не так хорошо. Я обновил ответ, чтобы добавить информацию о ручном/автоматическом KVO. –

0

Ответ на вопрос 2 - если у вас есть некоторые объекты, которые должны быть уведомлены о каком-либо событии, вы должны использовать NSNotifications (шаблон наблюдателя). Это поможет вам отреагировать на эти объекты, обновить их взгляды или так легко.

+0

Я читал, что использование NSNotifications может затруднить управление приложениями. У нас есть много HTTP-запросов, которые идут и выходят для нескольких моделей. Это по-прежнему хорошая идея или это должно быть сделано с несколькими делегатами? Возможно ли это? – VTS12

+0

вы можете увидеть [здесь] (http://stackoverflow.com/questions/1927965/nsnotificationcenter-vs-delegation-using-protocols) для разницы между ними. Как я знаю, весь код, написанный с уведомлениями, вы можете переписать с делегатами. В вашем случае, я думаю, что уведомления будут более легкими, чем делегаты. – medvedNick