我有一个与服务器通信的类(我们称之为'Downloader')。有时,服务器可能会因登录错误而拒绝连接。这个类的实例被许多不同的对象用于我的程序,当登录被拒绝时,Downloader需要告诉RootViewController显示登录界面。许多使用Downloader实例的类没有对RootViewController的引用,所以我通过我的应用程序委托(它引用了RootViewController)发送消息,如下所示:
[[[UIApplication sharedApplication] delegate] loginFailed];
然后,应用程序委托告诉rootViewController显示登录界面。我的问题是:这是最好还是“适当”的方式来做到这一点?它有效,但我试图坚持编码惯例。还有更好的方法吗?
答案 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