2011-09-24 81 views
1

为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不是单身人士,推测这将被解决。这是一个体面的设计方法吗?

感谢您花时间帮助我理解一个好的设计方法。我已经编码了几次,但总是陷入困境。另外,如果整个方法需要重新设计,请随时指向另一个方向。

非常感谢!

回答

1

我一直使用Global NSNotifications在用户登录或注销时发布。每个呈现不同数据的视图控制器都可以订阅这些通知,并在发生事件时相应地进行更新。

这很好,因为您可能已经有其他视图(可能在其他选项卡中)已经加载,并且在用户登录或注销时需要刷新。

+0

谢谢,布拉德。我看到那里的好处。在我的情况下,我想我会让文章管理器响应登录通知。然后,它可以在获取数据并通知其委托(ArticlesViewController)时进行另一次传递。 – jmac

0

一个想法是让ArticleManager成为 AuthenticationProvider的代表。这似乎适用于这种情况,但其他模型管理器也可能依赖于AuthenticationProvider。 推测如果AuthenticationProvider不是 单身人士,这将被解决。这是一个体面的设计方法吗?

也许相反,您可以让AuthenticationProvider单例提供AuthenticationSession对象,将调用者设置为AuthenticationSession的委托,并要求AuthenticationSession执行身份验证。

+0

谢谢,丹拉。你介意在你的回答中详细解释一下吗?这与AuthenticationProvider执行身份验证本身有什么不同?也许如果你明确描述使用ArticleManager,我会更好地遵循。 – jmac

+0

您可以在AuthenticationProvider中拥有身份验证信息,该身份验证信息可以保持为单例(只有一个状态,您可以进行身份​​验证或不验证...),并且AuthenticationSession将用作您的AuthenticationProvider代理。这是属于呼叫者的座席,因此您可以将呼叫者设置为代表。 – Danra