49

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

私が構築を考えている方法は、アプリケーション内のコントローラーを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

乾杯 !!!

4

1 に答える 1

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

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

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

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

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

最高、ブレイク

于 2011-04-14T13:01:04.300 に答える