0

iOS 5 以降、CoreData の新たにサポートされた並行機能に興奮しました。

プライベート キューが維持され、すべての保存またはフェッチ要求はそのキューを介して実行できます。

the private queueただし、 CoreData に対してリクエストを 1 つずつ実行するように設定することはできますか?

私のアプリは、多数のフィードからニュース項目をダウンロードしています。1 つのフィードからのダウンロードと解析が完了するたびに、プライベート キューを介してフィードの項目を CoreData に保存します。

ただし、複数のフィードから同時にダウンロードして解析しているため、常にアイテムの複数のグループ ( multiple save requestsCoreData など) があります。

今の状況は、CoreData にはいくつかのスレッドがあり、それぞれがアイテムのグループをデータベースに保存していると思います。その間、UI が動かなくなりました。

プライベート キューを制御して、同時保存要求がいくつあっても 1 つずつ処理できると思いますか?

4

1 に答える 1

3

Core Data は (おそらく) 1 つのシリアル キューまたはスレッドのみを使用しています。最近、作成したシリアル キュー (アプリは 4.3 でした) を使用してアプリを変換し、iOS 5 でこの新しいオプションを使用しました。また、'[moc performBlocK:...]' を任意のキューから呼び出すことができるようになりました。その呼び出しはスレッドセーフです!

あなたがやりたいことは、オプションを追加する可能性が最も高いバックグラウンド スレッドで、'performBlock:' (待機なし) を使用することだと思います。指定したブロックはキューに入れられ、FIFO 方式で処理されます。後で、テーブルがオブジェクトを取得したい場合は、「performBlockAndWait:」を発行できます。または、必要に応じて、コードで performBlock を使用して最新のオブジェクトを要求し、提供されたブロック メッセージの最後でオブジェクトのセットをアプリに返すことができます。あなたが必要です。

また、有効性を確認するために、開発ビルドでのみ頻繁に保存します。正常に動作していることを確認したら、すべてのデータがダウンロードされたら、バックグラウンド セーブを実行できます。

EIDT: 繰り返しますが、viewController の読み込み中に画像やその他のデータをダウンロードして使用していて、多くのことが行われている場合、これは保存を行う最悪のタイミングです。タイマーまたはdispatch_afterを使用し、すべてが安定しているように見えてから数秒後に保存します。

于 2012-09-13T21:31:26.817 に答える