我正在编写一个iPhone应用程序,我最终使用decided来使用RestKit作为连接REST服务的框架。
我考虑构建的方法是让我的应用程序中的控制器对RestKit完全不可知。例如。如果我有一个登录屏幕,在通常的RestKit场景中(基于示例程序以及RestKit开发人员创建的少量博客条目),您将让控制器实现RKRequestDelegate协议,并使用RKClient调用控制器中传递self (控制器)作为委托的服务。我想对开发控制器和视图的用户隐藏这一点。
我想的是以下几点。我会有一个LoginService,这将登录用户。将会有协议LoginServiceDelegate,它有两个成功和失败的方法。控制器可以实现登录并调用LoginService中的LoginServiceDelegate方法,并获得成功或失败的回调。然而,要做到这一点,我需要一些方法让我的LoginService将调用委托回控制器。RestKit不允许我这样做,我唯一能做到这一点的方法是:用LoginServiceDelegate初始化LoginService,将该委托存储为属性,并在登录成功或失败时调用委托中的适当方法。
这使我的控制器代码库保持在最低限度,并完全隐藏了LoginService的工作方式以及它内部使用的框架。委托的使用也将控制器从模型中分离出来,所以我们有了一个很好的MVC。然而,我关心的是Model类保留Controller对象的含义,因为它持有委托。
您将如何使用RestKit?如果你认为我的方法很好,你会做些什么来让它变得更好?如果你不喜欢我的方法,我想要你的反馈,为什么你认为这不是一个好的做法。
下面的代码片段应该会让你有更好的想法
@protocol LoginServiceDelegate;
@interface LoginService : NSObject <RKRequestDelegate>{
NSObject<LoginServiceDelegate> *_loginServiceDelegate;
}
@property (retain, nonatomic) NSObject <LoginServiceDelegate> *loginServiceDelegate;
- (id) initWithDelegate:(NSObject<LoginServiceDelegate>*) loginServiceDelegate;
- (void) login:(NSString *)username withPassword:(NSString *)password;
@end
@protocol LoginServiceDelegate
@optional
- (void) loginSuccess:(LoginInfo *) loginInfo;
- (void) loginFailure:(NSString *) message;
@end
干杯!
发布于 2011-04-14 21:01:04
我是RestKit的作者,我们提倡使用这样的模式在RestKit之上构建更高级别的抽象。我通常围绕模型对象构建回调函数,而不是创建新的LoginService类型的对象,但这两种方法都可以。在我的示例中,您将执行如下操作:
@implementation RKUser
- (void)loginWithDelegate:(NSObject<RKUserAuthenticationDelegate>*)delegate {}
@end
@protocol RKUserAuthenticationDelegate
- (void)userDidLogin:(RKUser*)user;
- (void)userDidFailLoginWithError:(RKUser*)user;
- (void)userDidLogout:(RKUser*)user
@end
在任何情况下,我建议的另一件事是将您的委托从保留更改为赋值。在你的dealloc方法中,你可以做一些事情:
从内存管理/内部管理的角度来看,这就是您需要担心的全部问题。我通常要做的另一件事是为我的身份验证生命周期事件创建通知。在我的经验中,你总是需要观察它们来更新UI。
你走在正确的轨道上,设计也很好。
最好的,布莱克
https://stackoverflow.com/questions/5661842
复制相似问题