アプリの設計上の問題に直面しています。
基本的に、アプリでやろうとしていることは次のとおりです。
単一のタスクは次のようになります。
- 基になる CoreData データベースからカスタム オブジェクトを読み取る
- URLからjsonをダウンロードする
- json を解析してカスタム オブジェクトを更新するか、新しいオブジェクトを作成します (解析には 1 ~ 3 秒かかる場合があります。ビッグ データ)。
- カスタム オブジェクトを分析します (一部の計算が含まれます。1 ~ 5 秒かかる場合があります)。
- カスタム オブジェクトを CoreData データベースに保存します。
多数のタスクが同時に実行される場合があります。
1 つのタスク内のステップは明らかにordered
(つまり、ステップ 2 で json をダウンロードしないと、ステップ 3 を続行できません) ですが、discrete
. たとえば、タスク 2 のステップ 4 は、タスク 1 のステップ 3 の前に実行できます (タスク 2 のダウンロードがタスク 1 よりも速い場合)。
タスクには優先順位があります。ユーザーは優先度の高いタスクを開始できるため、タスクのすべてのステップが他のすべてのステップより先に実行されます。
UI はできるだけレスポンシブであることが望ましいです。
したがって、優先度が最も低い NSThread を作成するつもりでした。
そのスレッドにカスタム優先イベント キューを配置しました。タスクのすべてのステップがイベント (作業単位) になります。したがって、たとえば、json をダウンロードするステップ 1 がイベントになります。ダウンロード後、イベントはステップ 3 の別のイベントを生成し、キューに入れられます。すべてのイベントには独自の優先順位が設定されています。
今、この記事を目にしました: Concurrency and Application Design。Apple は、 weとorMove Away from Threads
を使用することを提案しています。GCD
NSOperation
私はそれがNSOperation
私のドラフトデザインと非常に一致していることに気づきました. しかし、次の質問があります。
- iPhone/iPad の CPU コアを考慮して、NSOperationQueue を 1 つだけ使用するか、複数作成する必要がありますか?
- NSOperationQueue または NSOperation は、最も低いスレッド優先度で実行されますか? 実行は UI の応答に影響を与えますか (ステップには計算が含まれるので気にします)。
- 別のものから NSOeartion を生成してキューに入れることはできますか? NSOperation にキュー プロパティが表示されません。どうすればキューを確認できますか?
- NSOperationQueue を CoreData と連携させるにはどうすればよいですか? CoreData にアクセスするたびに、新しいコンテキストを作成する必要がありますか? それは高価になりますか?
- タスクの各ステップが NSOperation になります。この設計は正しいですか?
ありがとう