Могу ли я изменить делегата для объекта? - PullRequest
0 голосов
/ 22 февраля 2012

У меня есть класс RequestHandler, который принимает запросы для некоторого ViewController и асинхронно выбирает данные в Интернете.Чтобы уведомить ViewController, он реализует протокол, и ViewController установлен в качестве его делегата.

Теперь этот ViewController является TableViewController, и при выборе строки он помещает второй ViewController в NavigationStack.Этот второй (дочерний) ViewController должен также использовать RequestHandler.Как я могу сделать это делегатом для того же экземпляра RequestHandler?И как я могу убедиться, что он не будет связываться с родительским TableViewController, когда я вернусь к нему?

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

Тот факт, что оба контроллера представления захотят один и тот же запрос, указывает на ошибку проектирования.Контроллеры представления должны отображать текущее состояние Модели.Они не должны напрямую обрабатывать активные сетевые запросы.

У вас должна быть группа классов, представляющая ваши данные.Это называется Модель.Контроллеры представления должны заботиться только о модели, пока представление находится на экране.Таким образом, разумный шаблон выглядит следующим образом:

  • ViewController регистрирует уведомления об изменениях в модели
  • ViewController обновляет представление с текущими данными из модели.
  • ViewController запрашиваетupdate.
  • RequestManager (singleton) создает новый RequestHandler для его обработки.
  • По завершении RequestHandler сообщает RequestManager и освобождается.
  • RequestManager обновляет модель новыми данными
  • Модель предупреждает зарегистрированных наблюдателей, что она изменилась.
  • ViewController обновляет представление с текущими данными из модели.

Теперь не имеет значения, находится ли пользователь на этомили переместился к другому, или перешел к другому и вернулся.В случаях вызовов при каждом изменении модели текущее представление обновляется.

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

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

Теперь, когда создается новое представление, вы можете просто «зарегистрировать» его в своем RequestHandler.Точно так же, если представление будет закрыто, вы можете / должны отменить его регистрацию в RequestHandler.

...