为iOS开发了一段时间之后,我已经习惯了这门语言,并试图在设计结构良好的应用程序方面做得更好。最初我的工作重点是看到某些功能,所以我最终用巨大的视图控制器进行了可怕的设计。现在,我正在学习分离我的模型类,并试图让我的架构更加模块化。我非常感谢以下示例情况的任何建议:认证的可可设计模式
我正在开发一个应用程序(其中包括)从服务器中提取文章列表并显示它们。但是,用户必须经过身份验证才能检索此列表。由于应用程序的其他方面使用相同的身份验证,我希望单个类来管理身份验证。目标是当任何控制器从要求认证的模型请求数据时,如果用户未通过认证,认证提示将自动呈现。
我希望创建如下:
VIEW
- ArticlesView
- AuthenticationView
控制器
- ArticlesViewController
- AuthenticationViewController
- ArticleManager(单)
- 的AuthenticationProvider(单)
模型
- 文章
当应用程序首次加载,执行将达到ArticlesViewController的viewDidLoad方法。在这种方法中,我得到了一个ArticleManager的共享实例,指定认证类为认证提供者,并要求它提供最近的文章列表。
// ArticlesViewController.m
-(void) viewDidLoad {
...
AuthenticationProvider *authProvider = [AuthenticationProvider sharedInstance];
[[ArticleManager sharedInstance] setAuthenticationProvider:authProvider];
[[ArticleManager sharedInstance] fetchNewArticles];
}
如果没有认证是必要的,在ArticleManager将成功地从服务器检索列表,并张贴通知,告知有兴趣的人知道,这些条款已检索。该ArticlesViewController处理这个通知:
// ArticlesViewController.m
- (void) handleNewArticlesNotification:(NSNotification *)note {
[self updateUI];
}
然而,如果需要身份验证,用户需要有登录屏幕前的文章可以获取和显示。所以我想象ArticleManager做这样的事情:
// ArticleManager.m
- (void) fetchNewArticles {
if([self.authenticationProvider isAuthenticated]){
// go fetch list from the web
}
else {
[self.authenticationProvider presentAuthenticationRequest];
}
}
现在,在这一点上,我遇到了一些困难,充实的细节剩余部分。 AuthenticationProvider可以将AuthenticationViewController作为AppDelegate的窗口的rootViewController中的模式视图控制器提供,AuthenticationProvider将作为AuthenticationViewController的委托。 AuthenticationViewController可能会愚蠢到它正在采取的实际操作,并且它会委托(AuthenticationProvider)执行验证用户的工作。一旦用户通过身份验证,AuthenticationProvider会关闭模式视图控制器(AuthenticationViewController)。
但ArticleManager如何得到通知,它请求的身份验证已完成?它需要能够分别处理成功和失败的认证尝试。成功的身份验证最终会导致再次调用fetchNewArticles。
一个想法是让ArticleManager成为AuthenticationProvider的委托。这似乎适用于这种情况,但还有其他模型管理器也可能依赖于AuthenticationProvider。如果AuthenticationProvider不是单身人士,推测这将被解决。这是一个体面的设计方法吗?
感谢您花时间帮助我理解一个好的设计方法。我已经编码了几次,但总是陷入困境。另外,如果整个方法需要重新设计,请随时指向另一个方向。
非常感谢!
谢谢,布拉德。我看到那里的好处。在我的情况下,我想我会让文章管理器响应登录通知。然后,它可以在获取数据并通知其委托(ArticlesViewController)时进行另一次传递。 – jmac