我的应用程序目前拥有我非常确定的糟糕设计,但我不确定如何更好地组织它。例如: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合作了几个月,我很确定这几乎被认为是好的,但我更多确定有一些我想念的东西。这可以通过协议来实现吗?建议吗?
答案 0 :(得分:0)
代理用于在服务于不同角色的对象之间进行双向通信。通常一个对象知道如何做某事,而另一个对象,委托,知道该做什么。
当您进行单向通信时,通知通常是更好的选择。通过单向沟通,您不需要代表的正式性。
这两者可以一起使用。例如,UIApplication有一个委托,但也会发送许多委托调用的通知。
如果UserController是一个单例,那么任何实例都可以发出请求,它可以向所有感兴趣的对象广播结果通知。
[NSNotificationCenter defaultCenter]
会在您的应用程序中发送通知。