2010-11-27 9 views
1

私はiPhoneアプリのデザインに取り組んでいます。私は次のようにハイレベルで定義され、キックオフにはかなり強烈なプロセスを持っている:iPhoneで長い、依存する非同期プロセスを設計して開始する最も良い方法は?

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

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

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

質問/懸念:

それは設計とコーディングの観点からだが、一番簡単な方法は、すべてのステップのための一つの大きなNSOperationを使用することです。しかし、私はこれが後で私を苦しめるかもしれないと心配しています。私は間違った道を下って、後にたくさんのコードを裂かなければならない。

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

何か助けていただければ幸いです。

EDIT:これまでのすべての人の助けを

感謝。私が達成しようとしているものについて、私はユーザーが操作をキャンセルすることを望んでいません。しかし、私はアプリケーションが後続の操作をキャンセルできるようにしたい。私が実現に失敗したのは、試行錯誤によって発見されただけのことです(つまり、「奇妙な」瞬間)、別のプロセスで操作が開始されると、開始された子操作も同じ別のプロセスで実行されます。

以下にリンクされているAppleの記事を読んだところ、私のニーズのために、NSInvocationOperationが必要なものを正確に実行し、プロセスごとに別々のNSOperationオブジェクトを作成する必要がなくなりました。次に、NSErrorオブジェクトがメインスレッドに失敗した場合、またはメインスレッドが成功した場合に別のコールバックにコールバックします。

おそらく私は、ユーザーが今後キャンセルできるようにするために、他のプロセスとNSOperationを使用します。

答えて

2

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

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

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

+0

NSOperationQueueには、操作間の依存関係を設定するための、失敗したステップを処理するメカニズムがありません。キュー内の各操作は、それまでの操作の成功または失敗を確認する必要があります。また、外部操作によっては、依存操作の成功時に各操作を順次追加する必要があります。 –

+0

ありがとう、スティーブとアダム。 Adam、1つの大きな操作を行うことでこれを達成する最善の方法は?または、プロセスを続行するかどうかを確認するグローバル変数(BOOL?)を使用することをお勧めしますか?それとも良い方法がありますか? – jschmidt

+0

上記の私のコメントを無視してください。質問の私の編集を参照してください。 – jschmidt

1

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

「失敗したときに他の操作が実行されないようにするにはどうすればいいですか?

まず、NSOperationオブジェクトが市民であることを確認し、実行を停止できるように取り消されたかどうか定期的にチェックしてください。

次に、各操作のdependenciesを調べて、それらの依存関係がキャンセルされているかどうかを確認してください。それらがある場合は、現在の操作もやめるだけです。

関連する問題