1

これはデザインパターンの質問です。

サーバーと非同期に(ストリームを介して)対話するクライアントを開発しているプログラミングタスクを想像してみてください。課題が不確定な数のタスクを実行することであるとしましょう。各タスクは不確定な数の子タスクを生成する可能性があります(つまり、ツリーをクロールします)。各タスクはサーバーに対して非同期要求を行い、応答処理を処理するために2つのブロック(1つは期待される戻り条件を処理するため、もう1つはエラー条件を処理するため)を提供します。

このようなシナリオでは、アウトバウンドリクエストをキューに入れる方法を簡単に確認できますが、そのキューを空にしても、後続の応答処理でさらに多くのアウトバウンドリクエストがキューに入れられる可能性があるため、全体的なタスクが完了したことを意味しません。アウトバウンド要求キューは、全体的なタスクを完了する過程で複数回ゼロに達する可能性があります。

iOSでは、全体的なタスクが本当に完了した時期を判断するために、どのようなオプション(デザインパターンと便利なクラス)を提案できますか?

これのもう1つの問題は、エラーシナリオ(任意の子タスク)で、全体的なタスク(およびすべての子タスク)をキャンセルしたいということです。

前もって感謝します!

4

2 に答える 2

1

アウトバウンド要求のキューイングは、サーバーとクライアント間の通信に関係しているため、完了には関係ありません。

タスクを実行する必要があるときはいつでも、タスクの要求を送信し、現在保留中のタスクのコレクションに追加します。

回答を受け取ったら、それを処理し、最終的に新しいタスクを生成してから、保留中のタスクのコレクションから回答に関連するタスクを削除します。

保留中のタスクがなくなったら完了です。

エラーによる中止には、サーバーからの明示的なサポートが必要です。保留中のタスクの中止要求を送信できる必要があり、サーバーはそのタスクを中止し、この事実をユーザーに確認できる必要があります (または、サーバー上でタスクが既に完了しており、サーバーはすでにそのタスクの回答を送信しています)。

エラー応答を処理するときは、保留中のタスクのコレクションを調べて、それぞれに対して中止要求をサーバーに送信し、それらをキャンセル済みとしてマークします (ただし、保留中のタスク コレクションには残します)。

キャンセル済みとしてマークされたタスクの回答を受け取った場合、それが成功の回答、エラーの回答、または中止の確認のいずれであったかに関係なく、それを無視します (そして、コレクションからタスクを削除します)。

于 2012-08-09T10:10:00.983 に答える
0

申し訳ありませんが、私はあなたを正しく理解していない可能性があります.ASIHTTPRequest、http://allseeing-i.com/ASIHTTPRequest/を試してみてください。

于 2012-08-09T06:15:25.493 に答える