5

--UPDATE: AFNetworking を試してみることにしました。RestKit には非常に優れたオブジェクト マッピング機能がありますが、ネットワーク呼び出しの設計方法によって、いくつかのことが困難になりました。

RestKit を使用しているプロジェクトを整理する方法についてのアドバイスを期待しています。

リポジトリ クラスからいくつかの REST 呼び出しがあり、その結果がコントローラーに渡されます。たとえば、ブラウズ ビュー コントローラーから呼び出されるリポジトリ クラスに getProfile メソッドがあります。ビュー コントローラーは get profile 呼び出しのデリゲートとして設定され、リポジトリ クラスはレストキット呼び出しのデリゲートに設定されます。

問題は、ブラウズ コントローラーが複数のプロファイル取得要求を行う場合、すべてのレストキット呼び出しが同じデリゲート メソッド objectLoaderDidFinishLoading を共有するため、どの結果がどのデリゲート関数に送られるべきかを区別するのが難しいことです。次に、4 つの非同期 restkit 要求の結果と一致させる必要がある 4 つのデリゲートがあります。

適切なデリゲートを割り当てることができるように、ブロックを使用して関数を渡して実行することができる方法はありますか? 私が見たブロック サポートでは、レスト キットでリクエストが送信される前にブロックを使用できましたが、非同期の結果が返されたときにブロックを使用することに興味があります。

結果を調べるか、ユーザー データを設定し、どのデリゲートがどの非同期結果に対応するかを調べるという代替手段は、信頼性が低く、かさばるように見えます。

4

4 に答える 4

4

RKObjectLoader で userData 不透明ポインターを使用して、プロファイル リクエスト間のあいまいさを解消することで問題を解決できます。これにより、リクエストに必要なオブジェクトを掛けることができ、複数のプロファイル リクエストを区別するために使用できます。また、これらのプロファイル リクエストが異なる resourcePath に送信される場合は、RKObjectLoader で wasSentToResourcePath: メソッドを使用してそれらを区別することができます。

于 2011-10-28T13:29:44.647 に答える
0

AFNetworking への切り替えが進むべき道のようです...それは私が必要としていたものの実装がはるかに簡単でした。

于 2011-12-21T14:50:03.850 に答える
0

ブロックを使用することが問題を解決する正しい方法であるかどうかはわかりません。

RKObjectLoaderDelegate を実装するクラス GetProfile を持つことはどうですか。したがって、ここからリクエストを呼び出し、それ自体をデリゲートに設定します。次に、リクエストごとに objectLoader があります。

したがって、View Controller では、GetProfile を実行するたびにインスタンスを作成します。そして、そのインスタンスがコントローラーに (デリゲート経由で?) メッセージを返すと、それがどれであるかがわかります。

私もこの問題に取り組んでいるので、フィードバックを楽しみにしています。

于 2011-10-28T08:02:32.720 に答える
0

自分の REST インターフェイスでこの問題を理解しようとしているときに、この質問に出くわしました。やってよかったです。おそらく今はRestKitを使用します。

余談ですが、質問に戻ります。ご指摘のとおり、RKObjectManager のブロック引数がこのように使用されることを意図しているようには見えません。代わりに、RKObjectLoaderDelegate を実装し、ブロックを受け取り、任意のデリゲート呼び出しでそのブロックを呼び出すクラスを作成するのはどうでしょうか。

たぶん、このようなものですか?

@interface MyObjectLoaderDelegate : NSObject <RKObjectLoaderDelegate>

@property (nonatomic, copy) void (^callback)(RKObjectLoader *loader, NSDictionary *objectDictionary, NSError *error)

- (id)initWithCallback:(void (^)(RKObjectLoader*, NSDictionary*, NSError*)aCallaback;

@end

そして、実装されたデリゲート メソッドで、ブロックを実行できます。ブロックはスコープ変数を保持するため、呼び出しデリゲートに対してコードを実行できます。

どう思う?

于 2011-10-26T19:54:57.513 に答える