2010-07-29 2 views
1

У меня есть класс, который общается с сервером (назовем его «Downloader»). Иногда сервер может отклонить соединение из-за плохого входа в систему. Экземпляры этого класса используются по сравнению с моей программой множеством разных объектов, и когда вход отклонен, Downloader должен сказать RootViewController отобразить интерфейс входа в систему. Многие из классов, которые используют экземпляр Downloader не имеют ссылки на RootViewController, поэтому я посылаю сообщение через мое приложение делегата (который имеет ссылку на RootViewController), например так:Правильное использование делегата приложения для отправки сообщений

[[[UIApplication sharedApplication] delegate] loginFailed]; 

делегат приложения затем сообщает rootViewController отображать интерфейс входа в систему. Мой вопрос таков: это лучший или «правильный» способ сделать это? Он работает, но я стараюсь придерживаться правил кодирования. Есть ли способ лучше?

+0

Спасибо за все великие ответы! Я очень ценю это! – Chris

ответ

1

Ваш метод довольно распространенный и правильный. Я считаю, если вы делаете это часто вы можете добавить вспомогательный метод как это:

// in your <myappdelegateclassname>.h 
+(void)loginFailed; 

// in your <myappdelegateclassname>.m 
+(void)loginFailed 
{ 
    [[[UIApplication sharedApplication] delegate] loginFailed]; 
} 

Тогда в любом месте вашего приложения вы можете использовать:

[<myappdelegateclassname> loginFailed]; 

Просто замените все имена выше с вашим имена классов.

0

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

http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html

2

Это хорошее время, чтобы использовать уведомление.

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

Вот очень простой обзор звонков:

http://mac-objective-c.blogspot.com/2009/02/nsnotifications-broadcasting-mechanism.html

+0

+1; И используя шаблон Notification, вы можете избежать участия делегата приложения в реализации. Этот контроллер корневого представления может выполнять прослушивание и реагировать соответствующим образом. – ohhorob

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