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

#iphone #ios #delegates #nsuserdefaults

#iPhone #iOS #делегаты #nsuserdefaults

Вопрос:

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

Проблема заключается в том, что подробное представление создается TableView в конце строки списка tableViews. Подробное представление также создается первым TableView при нажатии на последний элемент.

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

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

Я ценю любой вклад.

Джейми

Ответ №1:

Я бы увидел здесь несколько решений:

1) продолжайте использовать NSUserDefaults, списки LRU (я думаю, последний раз использовавшийся) часто сохраняются в пользовательских настройках, независимо от того, хороший это дизайн или плохой. Если это не занимает много места и работает для вас, просто продолжайте.

2) создайте общий контекст для LRU, возможно, используя singleton, который был бы доступен со всего приложения, поместите туда свои изображения и получайте их обратно в любое время, когда они вам понадобятся. На самом деле вы могли бы создать его интерфейс, используя методы класса, и не утруждать себя созданием реального синглтона. Методы класса представляют собой приятный статический контекст, который легко доступен. В ObjC они даже могут быть переопределены! Что довольно круто по сравнению с Java.

3) используйте шаблон factory для создания представлений: существует один класс factory, который знает делегат, создание новых представлений будет снова реализовано с использованием методов класса: каждый метод create будет устанавливать один известный делегат для каждого представления независимо от точки создания.

4) теперь это действительно перебор, но очень-очень «несвязанный»: отправлять уведомления с недавно использованными изображениями. Те, кто заинтересован в том, чтобы узнать о них, зарегистрировались бы в качестве наблюдателей и, ну, получили изображения…

Комментарии:

1. Спасибо, Томаш. Я решил использовать некоторые методы класса для обработки сохранения последних изображений. У класса уже было свойство, содержащее ссылку на изображение, поэтому я решил, что класс может и будет отвечать за сохранение связанных с ним данных. Определенно приятно узнать чей-то взгляд на вещи, так что еще раз спасибо!