2011-12-27 3 views
0

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

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

Каковы варианты дизайна для этого?

Делегат приложения может иметь методы для запуска и остановки индикаторов активности, как указано в моделях и контроллерах. Но почему-то это не кажется мне совершенно чистым - его начало использовать делегат приложения так же, как ведро для сброса разной функциональности.

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

Есть ли чистое рекомендуемое решение?

+0

При проектировании вашей модели никогда не требуется доступ к пользовательскому интерфейсу. – Till

+0

ОП имеет хорошую точку. Является ли установка BOOL на экземпляре 'UIApplication' действительно рассматриваемой прямой манипуляцией с пользовательским интерфейсом? Это объект приложения, который обрабатывает пользовательский интерфейс строки состояния ... –

ответ

0

IMO, индикатор активности - это компонент вида, не зависящий от определенного вида, поэтому он должен управляться делегатом приложения.

Способ, которым я занимался, я создал класс ActivityManager, и я создаю экземпляр в своем делете приложения. Он принимает экземпляр UIWindow, и из этого я могу определить, как центрировать и отображать индикатор соответствующим образом. Все остальные области моего приложения взаимодействуют с этим классом через шаблон наблюдателя. Они публикуют уведомления, когда состояние сети изменилось, и мой менеджер активности оценивает общее состояние приложения, чтобы увидеть, нужно ли ему показывать или скрывать индикатор. Вот пример того, что вы можете увидеть в моем приложении:

ActivityManager *activityManager = [[ActivityManager alloc] initWithWindow:self.window]; 

self.activityManager = activityManager; 

[activityManager release]; 

[self.activityManager addNotification:kNetworkStatusDidChangeNotification]; 

[self.activityManager addAsyncActivity:[HttpManager defaultManager]]; 

[self.activityManager startObserving]; 

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

[self.activityManager stopObserving]; 

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

0

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

Представьте себе объект, который использует простой счетчик для отслеживания количества сетевых операций. Добавление события увеличивает счетчик, а удаление уменьшает счетчик. Пока счетчик равен> 0, счетчик виден. Это может быть разумным подходом к инкапсуляции связи между приложением и уровнем модели.

Смежные вопросы