iPhone proper usage of Application Delegate
我希望能够通过应用程序中的任何地方引用某些状态/对象。例如,用户登录到他们的应用程序,我需要调用Web服务并检索用户信息。然后,我希望能够从应用程序中的任何位置访问这些信息,方法如下:
1 2 | myAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; user = delegate.u; |
在应用程序委托中将实例变量设置为用户对象,并在需要时从中引用它,这是一种糟糕的方式吗?我通常在用户登录时将其设置在那里。
想听听专业人士是如何处理这个问题的。
通常情况下,只有在以下情况下,您才应将事物连接到应用程序代理:
- 是从与应用程序委托相同的NIB文件创建的(即单窗口接口中的静态UI元素)
- 与通过应用程序委托传递的应用程序级事件处理关联(如"首选项"窗口的菜单项)
对于其他一切,您应该创建一个管理对它们的访问的单例。
JasonCoco建议通过应用程序控制器进行路由。在我的程序中,我通常会避免这种情况,因为我认为这会给顶层带来太多的责任——我认为事情应该尽可能地自我管理,并且只有在需要在对等级模块之间进行协调时才应该使用更高级别的管理。
我不会链接我自己的博客,但是如果你用谷歌搜索我和单身汉,你可能会发现我写的一篇更详细的文章。
马特有点太谦虚了。他关于这个主题的文章是我读过的最好的文章之一,值得一个链接。http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html
我看你的方法没有任何问题。我通常用单件来处理这种情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | // MyCommon.h: @interface MyCommon class MyCommon : NSObject { int user; }; @property(assign) int user; + (MyCommon *)singleton; @end // MyCommon.m: @implementation MyCommon static MyCommon * MyCommon_Singleton = nil; + (MyCommon *)singleton { if (nil == MyCommon_Singleton) { MyCommon_Singleton = [[MyCommon_Singleton alloc] init]; } return MyCommon_Singleton; } @end |
然后在我的应用程序中的任何地方使用
1 | int user = [MyCommon singleton].user; |
通常,您会向应用程序的控制器询问这些信息,它将负责知道如何将其存储/查找到存在的任何数据模型中。应用程序的控制器可能与应用程序委托相同,也可能不同(在大多数简单的应用程序中,它是相同的)。