目标c-在iPhone应用程序中使用RestKit的最佳方法

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

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

我在想的是以下内容。 我将有一个LoginService,它将登录用户。 将有协议LoginServiceDelegate,它具有成功和失败的两种方法。 控制器可以实现LoginServiceDelegate并在LoginService中调用login方法,并获取成功或失败回调。 但是,要做到这一点,我将需要某种方式让我的LoginService将调用委派回控制器。 RestKit不允许我执行此操作,这是我能够执行此操作的唯一方法,方法是使用LoginServiceDelegate初始化LoginService,将该委托存储为属性,并在成功登录或失败时在委托中调用适当的方法。

这样可以使Controller代码库降至最低,并完全隐藏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

干杯!

Vidyanand asked 2020-02-13T12:59:41Z
1个解决方案
73 votes

我是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方法中,您可以做几件事:

  1. 取消委托,这样您就不会因回调而崩溃
  2. 询问请求队列以取消任何请求:[[RKRequestQueue sharedQueue] cancelRequestsWithDelegate:self];

从内存管理/整理的角度来看,这就是您需要担心的所有事情。 我通常总是做的另一件事是为身份验证生命周期事件创建通知。 根据我的经验,您总是需要观察它们以更新UI。

您走在正确的道路上,设计很好。

最好,布莱克

Blake Watters answered 2020-02-13T13:00:22Z
translate from https://stackoverflow.com:/questions/5661842/best-way-to-use-restkit-in-an-iphone-application