授权和选择者

时间:2010-06-29 06:02:43

标签: objective-c iphone cocoa-touch

我的应用程序目前拥有我非常确定的糟糕设计,但我不确定如何更好地组织它。例如:LoginViewController将用户名和密码的输入文本发送到UserController的实例。 UserController通过NetworkRequestController向我的服务器发送请求以验证用户名和密码,NetworkRequestController负责处理所有客户端 - 服务器通信。 NetworkRequestController解析服务器JSON响应并将其发送回UserController上的指定选择器,然后在通知视图结果之前完成所有业务。

目前,在LoginViewController的viewDidLoad方法中,UserController被实例化为LoginViewController的本地属性 - 虽然我觉得我更喜欢它是一个单例类。问题是我需要在UserController上设置另一个对象(例如LoginViewController)作为委托,以便使用适当的选择器将登录结果一直返回到视图。

//LoginViewController sends request to local UserController instance
[userController validateLoginWithDelegate:self 
    withResult:@selector(loginResult:) 
    forEmail:email.text 
    forPassword:password.text];

//UserController asks NetworkRequestController to send login to server
- (void)validateLoginWithDelegate:(id)delegateObj
    withResult:(SEL)onResult
    forEmail:(NSString *)email 
    forPassword:(NSString *)password {

    if(delegateObj != nil && onResult != nil){
        self.delegate = delegateObj;
        self.resultSelector = onResult;
    }

    NSString *url = [NSString stringWithFormat:@"/UserService.cfc?method=Authenticate&email=%@&password=%@&returnFormat=JSON", email, password];

    [[NetworkRequestController sharedNetworkRequestController] 
        requestJSONWithURLString:url 
        andDelegate:self 
        onFinished:@selector(onLoginResult:) 
        onFailed:nil 
        onOffline:nil 
        progressView:nil 
        timeout:30];

}

//NetworkRequestController sends the request to the server and sends the parsed JSON back to UserController
[delegate performSelector:onFinished withObject:parsedJSON];

//UserController does it's business and sends the result to the view
if(delegate != nil && resultSelector != nil){
    [delegate performSelector:resultSelector withObject:result];
}

我只与Obj-C和Cocoa合作了几个月,我很确定这几乎被认为是好的,但我更多确定有一些我想念的东西。这可以通过协议来实现吗?建议吗?

1 个答案:

答案 0 :(得分:0)

代理用于在服务于不同角色的对象之间进行双向通信。通常一个对象知道如何做某事,而另一个对象,委托,知道该做什么。

当您进行单向通信时,通知通常是更好的选择。通过单向沟通,您不需要代表的正式性。

这两者可以一起使用。例如,UIApplication有一个委托,但也会发送许多委托调用的通知。

如果UserController是一个单例,那么任何实例都可以发出请求,它可以向所有感兴趣的对象广播结果通知。

[NSNotificationCenter defaultCenter]会在您的应用程序中发送通知。