2010-07-29 43 views
1

我有一个与服务器通信的类(我们称之为'Downloader')。有时候,服务器可能会因拒绝登录而拒绝连接。这个类的实例被许多不同的对象通过我的程序使用,当登录被拒绝时,Downloader需要告诉RootViewController显示一个登录界面。许多利用下载器的实例没有到RootViewController的参考类的,所以我送通过我的应用程序代理(其中有RootViewController的参考)的消息,像这样:正确使用应用程序委托来发送消息

[[[UIApplication sharedApplication] delegate] loginFailed]; 

的应用程序委托会告诉rootViewController显示登录界面。我的问题是:这是做到这一点的最佳方法吗?它有效,但我试图坚持编码惯例。有没有更好的办法?

+0

感谢所有伟大的答案!对此,我真的非常感激! – Chris 2010-07-30 22:19:56

回答

1

你的方法很常见和正确。我发现,如果你正在做的这个时候,你可能要添加一个辅助方法是这样的:

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

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

然后在你的应用程序的任何地方,你可以使用:

[<myappdelegateclassname> loginFailed]; 

只需更换以上所有的名字你类名称。

2

这是使用通知的好时机。

您可以让应用程序委托(或任何类)订阅特定的命名通知,让其知道登录失败,然后拉出登录表。后台下载器只需发布通知,然后它不关心之后会发生什么。中间的班级都不知道发生了什么事情(除非他们不会获取他们要求的数据)。

这里的电话一个非常简单的概述:

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

+0

+1;并且使用通知模式,可以避免在应用程序中涉及App Delegate。该根视图控制器可以进行监听,并根据需要作出反应。 – ohhorob 2010-07-29 05:44:47