0

私はマルチスレッドコアデータダウンローダを実装しています。2つの異なるスレッドから一意のエンティティIDを持つコアデータ永続ストアへの同時保存

エンティティに一意の文字列属性を持つオブジェクトを保存している間に、オブジェクトを倍増させることに問題があります。

2つのスレッドが同じURLから同時にダウンロードされている場合(つまり、アップデータタイマーが起動し、アプリケーションがフォアグラウンドに入るため、ユーザーがupdateメソッドを呼び出す)、永続ストアの一意の属性値を持つオブジェクトの存在を確認できません倍増する。

オブジェクトを2倍にすることを避けるにはどうしたらよいですか?パフォーマンス面で最高の解決策は何ですか?

説明:(申し訳ありませんが、私はまだ画像を投稿カント) http://i.stack.imgur.com/yMBgQ.png

答えて

0

もう1つの方法は、NSOperationの中でダウンロード/保存を実行し、操作をキューに追加する前に、そのURLをダウンロードする既存の操作がNSOperationQueueにあるかどうかを確認できます。

このアプローチの利点は、必要以上にデータをダウンロードしないことです。

+0

パウルベイリー、deanWombourne、ありがとうございます。 私はこの方法で、objectForKey:NSMutableDictionaryの存在をチェックしました。ここでkeyは[url absoluteString]です。 そしてないdeanWombourne numConcurrentOperations = 1で私のCoreDataUpdateManager.hは、いくつかの輸入業者(XML、JSONなど)の抽象工場が含まれていることであり、多くのスレッドで異なるエンティティのためのデータをダウンロードするために、キュー内の操作を管理する理由。 勇敢な解決策ではありませんが、機能します) – Renatus

0

私は前にこれに遭遇したのだが、トリッキーな問題です。

別々のバックグラウンドスレッド(これまでと同じ)でダウンロードを実行して解決しましたが、すべてのコードデータ書き込み操作はnumConcurrentOperationsが1に設定されたグローバルNSOperationキューで実行されます。 NSOperationをそのキューに配置します。

グッド:非常に単純なスレッドの安全性 - NSOperationQueueは、ある時点でCoreDataに1つのスレッドしか書き込んでいないことを保証しました。

悪い:Core Data操作が並列ではなく連続して機能していたため、パフォーマンス面でわずかに低下しました。これは、ダウンロードバックグラウンドスレッドのデータに必要な計算を実行し、コアデータ操作でできるだけ実行しないことで軽減できます。

関連する問題