在iPhone应用程序中使用RestKit的最佳方式

在iPhone应用程序中使用RestKit的最佳方式,iphone,objective-c,ios,rest,restkit,Iphone,Objective C,Ios,Rest,Restkit,我正在编写一个iPhone应用程序,最后我不得不使用RestKit作为连接REST服务的框架 我考虑构建的方式是让我的应用程序中的控制器与RestKit完全无关。例如,如果我有一个登录屏幕,在通常的RestKit场景中(基于示例程序以及RestKit开发人员创建的少量博客条目),您将让控制器实现RKRequestDelegate协议,并使用RKClient调用控制器中的服务,将self(控制器)作为代理传递。我想对开发控制器和视图的用户隐藏这一点 我想的是以下几点。我将有一个登录服务,它将登录用

我正在编写一个iPhone应用程序,最后我不得不使用RestKit作为连接REST服务的框架

我考虑构建的方式是让我的应用程序中的控制器与RestKit完全无关。例如,如果我有一个登录屏幕,在通常的RestKit场景中(基于示例程序以及RestKit开发人员创建的少量博客条目),您将让控制器实现RKRequestDelegate协议,并使用RKClient调用控制器中的服务,将self(控制器)作为代理传递。我想对开发控制器和视图的用户隐藏这一点

我想的是以下几点。我将有一个登录服务,它将登录用户。将有协议LoginServiceDelegate,它有两种成功和失败的方法。控制器可以实现LoginServiceDelegate,并在LoginService中调用login方法,获得成功或失败的回调。然而,要做到这一点,我需要一些方法让我的LoginService将调用委托回控制器。RestKit不允许我这样做,这是我能够通过使用LoginServiceDelegate初始化LoginService、将该委托存储为属性并在成功登录或失败时调用委托中的相应方法来实现的唯一方法

这将使我的控制器代码库保持在最低限度,并完全隐藏LoginService的工作方式及其内部使用的框架。委托的使用还将控制器与模型分离,因此我们有了一个很好的MVC。但是,我担心模型类保留控制器对象的含义,因为它保留委托

您将如何使用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
@协议登录服务委托;
@接口登录服务:NSObject{
NSObject*_loginServiceDelegate;
}
@属性(保留,非原子)NSObject*loginServiceDelegate;
-(id)initWithDelegate:(NSObject*)loginServiceDelegate;
-(void)登录:(NSString*)用户名和密码:(NSString*)密码;
@结束
@协议登录服务委托
@可选的
-(无效)登录成功:(登录信息*)登录信息;
-(void)登录失败:(NSString*)消息;
@结束

干杯

我是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
@实现用户
-(void)loginWithDelegate:(NSObject*)委托{}
@结束
@协议RKUserAuthenticationDelegate
-(void)userDidLogin:(RKUser*)用户;
-(void)userDidFailLoginWithError:(RKUser*)用户;
-(void)userDidLogout:(RKUser*)用户
@结束
在任何情况下,我建议的另一件事是将您的代理从保留更改为分配。在dealloc方法中,您可以做以下几件事:

  • 取消委托,这样您就不会被回调崩溃
  • 要求请求队列取消任何请求:
    [[RKRequestQueue sharedQueue]cancelRequestsWithDelegate:self]
  • 从内存管理/内部管理的角度来看,这就是您需要担心的所有问题。我通常会做的另一件事是为身份验证生命周期事件创建通知。在我的经验中,你总是需要观察它们来更新UI

    你走在正确的轨道上,设计很好

    最好的,
    布莱克

    @Blake watters感谢您提供如此出色的框架。很高兴知道我在正确的轨道上。@blake watters我有一个关于你提供的代码的澄清。您提到loginWithDelegate将接受RKUserAuthenticationDelegate。但是让我们说,在您的方法中,您正在调用post方法,您正在使用RKRequestDelegate,并使用一些回调来进行异步消息传递。因此,您的回调将请求:didloadsresponse方法。如何传递RKUserAuthenticationDelegate。这就是我最初想要做的。由于我无法找到发送回叫的方法,我不得不将其作为LoginService对象的属性。RKRequestDelegate不再适用于RK 0.2