我正在编写一个iPhone应用程序,我终于decided使用RestKit作为连接REST服务的框架。
我正在考虑构建的方法是让我的应用程序中的控制器与RestKit完全无关。例如。如果我有一个登录屏幕,在通常的RestKit场景中(基于示例程序以及RestKit开发人员创建的一些博客条目),您将让控制器实现RKRequestDelegate协议并使用RKClient在Controller传递中调用服务自我(控制者)作为代表。我想隐藏用户开发控制器和视图。
我在想的是以下内容。我将有一个登录用户的LoginService。会有协议LoginServiceDelegate,它有两个成功和失败的方法。 Controller可以实现LoginServiceDelegate并在LoginService中调用login方法并获得成功或失败回调。但是要做到这一点,我需要一些方法让我的LoginService将调用委托给控制器。 RestKit不允许我这样做,这是我能够通过使用LoginServiceDelegate初始化LoginService,将该委托存储为属性并在成功登录或失败时在委托中调用适当的方法来实现此目的的唯一方法。
这使我的Controller代码库保持在最低限度,并完全隐藏了LoginService的工作方式以及它内部使用的框架。委托人的使用也使Controller与模型分离,因此我们有一个很好的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
干杯!!!
答案 0 :(得分:73)
我是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方法中,你可以做几件事:
[[RKRequestQueue sharedQueue] cancelRequestsWithDelegate:self];
从存储器管理/管家角度来看,这就是你需要担心的一切。我通常总是做的另一件事是为我的身份验证生命周期事件创建通知。根据我的经验,你总是需要观察它们来更新UI。
你走在正确的轨道上,设计很好。
最佳, 布雷克