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

我正在编写一个iPhone应用程序,我终于决定使用RestKit作为连接到REST服务的框架。

我想构build的方式是让我的应用程序中的控制器完全不可知的RestKit。 例如。 如果我有一个login屏幕,在通常的RestKit场景中(基于示例程序以及由RestKit开发人员创build的一些博客条目),您将使控制器实现RKRequestDelegate协议,并使用RKClient调用Controller中传递的服务自我(控制者)作为委托人。 我想隐藏从用户开发控制器和视图。

我在想的是以下。 我将有一个login用户的LoginService。 将有协议LoginServiceDelegate有两种成功和失败的方法。 控制器可以实现LoginServiceDelegate并在LoginService中调用Login方法,获得成功或失败的callback。 但是要做到这一点,我需要一些方法让我的LoginService将调用委托给控制器。 RestKit不允许我这样做,唯一的办法是通过用LoginServiceDelegate初始化LoginService,将该代理存储为属性,并在成功login或失败时在委托中调用适当的方法来完成此操作。

这使我的控制器代码库保持最小,完全隐藏了LoginService如何工作以及它在内部使用什么框架。 委托的使用也将控制器与模型分开,所以我们有一个很好的MVC事情。 但是我担心保留Controller对象的Model类的影响,因为它保留在委托中。

你将如何使用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 

干杯!

我是RestKit的作者,我们主张使用这种模式在RestKit之上构build更高层次的抽象。 我通常build立我的callback等围绕模型对象,而不是创build一个新的LoginServicetypes的对象,但任何一种方式都是好的。 在我的例子中,你会做这样的事情:

 @implementation RKUser - (void)loginWithDelegate:(NSObject<RKUserAuthenticationDelegate>*)delegate {} @end @protocol RKUserAuthenticationDelegate - (void)userDidLogin:(RKUser*)user; - (void)userDidFailLoginWithError:(RKUser*)user; - (void)userDidLogout:(RKUser*)user @end 

在任何情况下,我build议的另一件事是将您的委托从保留更改为分配。 在你的dealloc方法中,你可以做几件事情:

  1. 将代理无效,所以不会因callback而崩溃
  2. 请求请求队列取消任何请求: [[RKRequestQueue sharedQueue] cancelRequestsWithDelegate:self];

这就是所有你需要从内存pipe理/内务pipe理的angular度来担心。 我通常总是closures的另一件事是为身份validation生命周期事件创build通知。 你总是需要观察它们来根据我的经验更新UI。

你在正确的轨道上,devise很好。

最好的,布雷克