web-dev-qa-db-ja.com

iPhoneアプリケーションでRestKitを使用する最良の方法

私はiPhoneアプリケーションを書いていますが、最終的に 決定 RestKitをRESTサービスに接続するためのフレームワークとして使用することにしました。

私が構築することを考えている方法は、アプリケーション内のコントローラーをRestKitに完全に依存しないようにすることです。例えば。ログイン画面がある場合、通常のRestKitシナリオ(サンプルプログラムとRestKit開発者によって作成されたいくつかのブログエントリに基づく)では、コントローラーにRKRequestDelegateプロトコルを実装させ、RKClientを使用してコントローラーパスでサービスを呼び出します。デリゲートとしてのself(コントローラー)。コントローラとビューを開発しているユーザーからそれを隠したいと思います。

私が考えているのは次のとおりです。ユーザーにログインするLoginServiceがあります。成功と失敗の2つのメソッドを持つプロトコルLoginServiceDelegateがあります。また、コントローラーはLoginServiceDelegateを実装し、LoginServiceのloginメソッドを呼び出して、成功または失敗のコールバックを取得できます。ただし、これを行うには、LoginServiceが呼び出しをコントローラーに委任するための何らかの方法が必要になります。 RestKitではこれを行うことができず、LoginServiceDelegateを使用してLoginServiceを初期化し、そのデリゲートをプロパティとして保存し、ログインの成功または失敗時にデリゲートで適切なメソッドを呼び出すことによってこれを行うことができる唯一の方法です。

これにより、コントローラーのコードベースが最小限に抑えられ、LoginServiceの動作と内部で使用されるフレームワークが完全に隠されます。デリゲートを使用すると、コントローラーがモデルから切り離されるため、MVCがうまく機能します。ただし、モデルクラスがデリゲートを保持しているため、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

乾杯!!!

49
Vidyanand

私は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

いずれにせよ、私がお勧めするもう1つのことは、デリゲートを保持から割り当てに変更することです。あなたのdeallocメソッドでは、いくつかのことができます:

  1. コールバックによってクラッシュしないように、デリゲートをゼロにします
  2. リクエストキューにリクエストをキャンセルするように依頼します:[[RKRequestQueue sharedQueue] cancelRequestsWithDelegate:self];

これが、メモリ管理/ハウスキーピングの観点から心配する必要があるすべてのことです。私がいつもやることになるもう1つのことは、認証ライフサイクルイベントの通知を作成することです。私の経験のどこかでUIを更新するために、常にそれらを観察する必要があります。

あなたは正しい方向に進んでおり、デザインは素晴らしいです。

最高、ブレイク

73
Blake Watters