2

いくつかのレシピを一覧表示するテーブル ビューを想像してみてください。ユーザーがレシピをタップするたびに、レシピの材料を一覧表示する新しいテーブル ビューが読み込まれます。

情報を取得するために、次を使用して REST API を非同期呼び出ししています。

NSURLRequest *request = [NSURLRequest requestWithURL:url
                                      cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                      timeoutInterval:30];

ユーザーがレシピをタップすると、レシピの材料を取得するために API が呼び出されます。ただし、新しいビュー (材料のリスト) に入ると、回答を受け取る前に、ユーザーは戻って新しいレシピを選択できます。

この場合、私は 2 つの答えを受け取ります。リクエストごとに 1 つ。問題は、この回答がどのリクエストに対するものなのかわからず、間違った回答から間違ったコンテンツで UI を更新することです。

この場合、どちらが正しいアプローチかわかりません。各リクエストパラメーターを回答に含めることを考えています。したがって、たとえば、API を使用して特定の用語を検索する場合、「foo」と言います。その用語も回答に含めます。次に例を示します。

リクエスト:

http://domain.com/api/search?term=foo

答え

{
"requestType": "search",
"term": "foo",
"result" : "a foo result"
}

各回答に各リクエスト パラメータを含めるのは奇妙に思えますが、非同期で呼び出す準備ができたステートレス API を作成するために見つけた唯一の解決策です。

これを達成する他の方法はありますか?

(私は、回答が受信されたときに呼び出される各リクエストにオブジェクトを割り当てるデリゲート パターンを使用しています。問題は、レシピの例では、レシピの材料がリストされるたびに材料テーブル ビューが再利用されることです)。

4

2 に答える 2

2

1つの可能性は、リクエストに一意の「リクエストID」を含め、サーバーがそれをエコーすることです。その場合、サーバーはすべてのリクエストパラメータを返す必要はなく、リクエストIDだけを返す必要があります。クライアントは、リクエストごとに新しいIDを生成します。おそらく、整数をインクリメントするような単純なものを使用します。

もう1つの可能性は、「キャンセル可能な非同期要求」を作成することです。リクエストを発行するときは、リクエストをキャンセルするために使用できるオブジェクトを返します。デリゲートが解雇される前にリクエストがキャンセルされた場合は、デリゲートが解雇されないようにしてください。キャンセルされたリクエストに対する応答が返ってきたら、それを破棄します。材料テーブルについては、新しいリクエストを発行する前に、保留中のリクエストをキャンセルします(一度にキャンセルされていないリクエストは最大で1つになります)。

これを実装する1つの方法は、2段階のコールバックを作成することです。インフラストラクチャによって管理される最初のコールバックは、要求がキャンセルされたかどうかを確認するだけです。そうでない場合は、2番目のコールバック(実際にはデリゲート)を呼び出します。

于 2010-01-23T17:58:00.140 に答える
0

ここでの一般的なアプローチは、提案したように、各レシピに単一の一意の値(「キー」値)を割り当てて、それを応答で送り返すことです。キー値は、一意で短い場合はレシピ名にすることができますが、より一般的な戦略は、一意の番号またはユーザーにとって無意味な別の値を使用することですが、(例)名前が変更されます。データベースの専門用語では、これはビジネスキーと代理キーの違いです。どちらも一意の識別子ですが、ビジネスキーはユーザーにとって意味があり(名前など)、代理キーは意味がありません。代理キーは短くすることができ、ユーザーが気にしないため変更する必要がないため、代理キーを使用することをお勧めします。

いずれかのWebサービス呼び出しでキーバックをパラメーターとして受け入れる場合は、クライアントがキーバックを改ざんするかどうかわからないため、キーバックを検証する(またはセキュリティが懸念される場合は暗号化する)必要があることに注意してください。

ちなみに、ここでは、クライアントが最近選択されたレシピを「知っている」ので、他のレシピの応答を無視できると仮定しています。

于 2010-01-23T17:59:07.413 に答える