1

私はiPhoneアプリのデザインに取り組んでいます。私には、次のように高レベルで定義された、開始するためのかなり激しいプロセスがあります。

  1. ユーザーは、アプリ内購入のためにUITableViewからアイテムを選択します。
  2. ユーザーがUIで購入を確認します。
  3. 非同期プロセスはAppStoreに移動し、アイテムが以前に購入されたかどうかを確認します。そうでない場合、アイテムは購入されます。その後、iPhoneアプリにアイテムの購入が成功したことが通知されます。(以前に購入した場合、アプリは気にせず、手順4に進みます。)
  4. 次に、アプリはプライベートサーバーに移動して、購入したアイテムのデータをダウンロードします。
  5. 次に、アプリはデータをCoreDataにインポートします。

もちろん、プロセスの各ステップでエラーがユーザーに報告され、プロセス全体が停止します。

何が起こっているかを示すテキストとともに、ユーザーに優れたUIActivityIndi​​catorを提示するactivityIndi​​catorControllerというクラスがあります。プロセスの各ステップで、activityIndi​​catorのラベルを新しいステータスで更新する必要があります。

質問/懸念:

設計とコーディングの観点からすると、最も簡単なことは、すべてのステップで1つの大きなNSOperationを使用することです。しかし、これが後で私を悩ますかもしれないのではないかと心配しています。私は間違った道をたどり、後でたくさんのコードを切り離さなければならないことを望んでいません。

私の内臓は、3つの別々のNSOperations(OpInAppPurchase、OpDownload、OpImport)を実装する方が良いと言っています。ただし、後続の各操作は、前の操作に依存しているだけでなく、1つが失敗した場合は、残りのNSOperationsをまったく呼び出さないでください。しかし、これをどのように設計/コーディングするかはわかりません。

どんな助けでも大歓迎です。

編集:

これまでの皆さんの助けに感謝します。私が達成しようとしていることについては、ユーザーに操作をキャンセルしてほしくない。ただし、アプリで後続の操作をキャンセルできるようにしたいと思います。私が気づかず、試行錯誤(つまり「当たり前」の瞬間)によってのみ発見されたのは、操作が別のプロセスで開始されると、開始される子操作も同じ別のプロセスで実行されるということです。 。

以下にリンクされているAppleの記事を読んだ後、私は今の自分のニーズに合わせて、NSInvocationOperationが必要なことを正確に実行し、プロセスごとに個別のNSOperationオブジェクトを作成する必要がないことを発見しました。次に、失敗した場合はメインスレッドへのNSErrorオブジェクトを使用してコールバックを実行し、成功した場合はメインスレッドへの別のコールバックを実行します。

おそらく、ユーザーが将来キャンセルできるようにしたい他のプロセスがいくつかあり、他のイベントでNSOperationを使用します。

4

2 に答える 2

2

各ステップをに追加することにより、NSOperationQueue続行する前にステップが失敗したことを確認できます。一般的なアプローチについては、この記事を参照してください。

操作で問題が発生した場合は、NSOperationからのキャンセル要求を開始して応答することもできます。この記事のキャンセルイベントへの対応を参照してください。

キャンセルイベントへの対応:

操作の実行が開始された後、操作が終了するまで、またはコードが操作を明示的にキャンセルするまで、操作はタスクの実行を継続します。キャンセルは、操作の実行が開始される前であっても、いつでも発生する可能性があります。NSOperationクラスは、クライアントが操作をキャンセルする方法を提供しますが、キャンセルイベントの認識は、必然的に任意です。操作が完全に終了した場合、割り当てられたメモリまたはリソースを再利用する方法がない可能性があります。その結果、操作オブジェクトはキャンセルイベントをチェックし、操作の途中で発生すると正常に終了することが期待されます。

于 2010-11-27T15:34:27.027 に答える
1

を使用しNSOperationQueueます。各タスクを独自のにカプセル化しますNSOperation。を使用して依存関係を設定しaddDependency:ます。

「1つが失敗したときに他の操作が実行されないようにするにはどうすればよいですか?」とあなたは尋ねます。

まず、NSOperationオブジェクトが善良な市民であることを確認し、実行を停止できるように、オブジェクトがキャンセルされているかどうかを定期的に確認します。

次に、各操作を実行して、dependenciesそれらの依存関係がキャンセルされているかどうかを確認します。そうである場合は、現在の操作も終了/キャンセルします。

于 2010-11-28T02:34:38.417 に答える