0

複数のNSOperationによってアクセスされる1つのプライベート管理対象コンテキストを持つことはできますか?複数のNSOperationを持つコアデータ

私は2つの2つのオプションがあります。

  1. はNSOperationあたりの管理対象オブジェクトコンテキストを持っています。 つまり、100のNS操作がある場合、100のコンテキストが作成されます。

  2. 単一のコンテキストと複数のNSOperationがあります。

つまり、それにアクセスする単一コンテキストと100個のNSOperationsです。

これは、より良い選択肢です。

+0

を単一MOC

func performAndWait(_ block: @escaping() -> Swift.Void) 

を持つ任意の同時問題を回避する必要があり、あなたのNSOperationQueueのmaxConcurrentOperationCountは何ですか? NSOperationsを同時に実行できますか?単一のNSOperationによって実行される作業の量(保存するオブジェクトの量または作業を行う秒単位)は何ですか? – Sander

+0

1. maxConcurrentOperationCountは現在デフォルトのままです。 2.単一のNSOperationによって行われる作業の量は何ですか? - サーバオブジェクトと比較してコアデータから1つのオブジェクトがフェッチされ、その後オブジェクトが勝ち、オブジェクトとファイルがアップロードまたはダウンロードされてディスクに書き込まれます。 – user3519594

+0

説明したように、一度の操作で多数の新しいデータをCoreDataに保存することはありません。したがって、単一のコンテキストを持ち、そこから任意のオブジェクトをフェッチできます。並行性の問題を避けるために、performAndWait関数を使用できます。 – Sander

答えて

0

修正ソリューションはオプション1です。並行回数が1のキューを作成し、すべての書き込みをキューで行います。これにより、書き込みの競合が回避され、情報が失われる可能性があります。メインスレッドの情報にアクセスする必要がある場合は、グローバルメインスレッドコンテキスト(NSPersistentContainerではviewContext)を使用する必要があります。

これが遅くなる場合は、実行している作業を調査する必要があります。一般的に、各操作は非常に迅速に行う必要があります。そうでない場合は、何か間違っている可能性があります(一般的な問題は、1つの大きなフェッチではなく、もう1つの解決策は、大きなタスクをいくつかの小さなタスクに分割することです(大量のデータをインポートする)。異なるプライオリティを設定することもできます - ユーザが開始したアクションに高い優先度を与えます。

コンテキストを作成することを恐れてはいけません。彼らはそれほど高価ではありません。

0

コメントによると、実際には1回の操作で多くのデータを書き込むのではなく、オブジェクトをフェッチしただけであるから、MOCという単体を使用することをお勧めします。

MOCが複数存在する通常の理由は、Main contextと他のコンテキストとは独立して多数のデータを読み取り/更新/保存することです。そのようなフローでは、異なるコンテキストから同時にオブジェクトを保存することができます。

私が正しく理解していれば、あなたの場合ではありません。

1回のフェッチでは、1つの数字がPrivate contextで十分ですが、多くのコンテキストを作成するにはオーバーヘッドが大きくないと思います。しかし、なぜ余分な仕事をするのですか?

1.So

は、あなたがプライベートMOC

let privateContext = NSManagedObjectContext(concurrencyType:.privateQueueConcurrencyType) 

2.Create各操作を作成して、操作が機能付きプライベートMOCへの同期呼び出しを行うMOC

let operation = MyOperation(context: privateContext) 

3.Inを渡します。 このようにあなたが例えば

let myObject: Object? 
privateContext.performAndWait { 
    myObject = privateContext.fetch(...) 
} 
// do what you need with myObject 
関連する問題