正确使用Application Delegate发送消息

时间:2010-07-29 01:52:16

标签: iphone objective-c

我有一个与服务器通信的类(我们称之为'Downloader')。有时,服务器可能会因登录错误而拒绝连接。这个类的实例被许多不同的对象用于我的程序,当登录被拒绝时,Downloader需要告诉RootViewController显示登录界面。许多使用Downloader实例的类没有对RootViewController的引用,所以我通过我的应用程序委托(它引用了RootViewController)发送消息,如下所示:

[[[UIApplication sharedApplication] delegate] loginFailed];

然后,应用程序委托告诉rootViewController显示登录界面。我的问题是:这是最好还是“适当”的方式来做到这一点?它有效,但我试图坚持编码惯例。还有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

现在是使用通知的好时机。

您可以让应用程序委托(或任何类)订阅特定的命名通知,让它知道登录失败,并提取登录表。后台下载程序只需发布通知,然后它不关心之后会发生什么。中间的所有类都不知道发生了什么(除了他们不会得到他们要求的数据)。

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

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

答案 1 :(得分:1)

你的方法非常普遍和正确。我发现如果你经常这样做,你可能想要添加一个这样的辅助方法:

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

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

然后您可以在应用中的任何位置使用:

[<myappdelegateclassname> loginFailed];

只需用您的班级名称替换上面的所有名称。

答案 2 :(得分:0)

您可能希望为此目的创建Singleton类。可以使用App Delegate,但它会使您的应用程序混乱。这是一篇关于单身人士的优秀文章,其中还讨论了为此目的使用app委托的缺点:

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