2016-07-23 9 views
6

私のアプリはWebサービスに接続し、3つの異なる方法からPOSTを実行し、これらの3つのデータセットをコアデータに挿入します。新しいデータが利用可能になるたびに、コアデータのすべてが削除され、新しいデータが挿入されます。これらの3つの方法のそれぞれは異なるTableViewControllersで表示されます。つまり、これらのそれぞれが表示されるたびに3つ以上のフェッチが表示されます。TableViewControllersコアデータの削除、挿入、フェッチを実行する正しいスレッド

私たちは、Webサービスからフェッチされた3セットのデータを持っています。次に、これらをすべて別のエンティティに挿入して、新しいデータをフェッチしてメインTableViewControllerに表示します。

私はスレッドとマルチコンテキストコアデータ構造の複雑な関係に苦しんでいます。アプリケーションのスレッドの安全を確保するために、挿入、削除、フェッチをどこで実行する必要がありますか?

+0

どのくらいのデータがありますか?現在どのようなコンテキストやスレッドがありますか? – Wain

+0

@Wainデータは比較的小さいです。各エンティティには約1,000件のレコードがあります。 NSURLSessionは、メインスレッド上で完了ハンドラを処理しています。次に、メインスレッドNSMainQueueConcurrencyTypeで削除するメソッドを呼び出し、メインスレッド/ NSPrivateQueueConcurrencyTypeを挿入します。その後、メインスレッドとメインコンテキストでフェッチが行われます。 – user3687

答えて

1

マルチコンテキストのCoreDataでは、privateQueueRootMOCとmainQueueRootMocを持つことができます。メインMOCはmainThreadのデータをフェッチするために使用され、プライベートMOCはprivateMOCスレッドのデータの更新、挿入、および削除に使用されます。

privateMOC.performBlock({() -> Void in 
    //try insert, delete, update 
    .... 
    try privateMOC.save() 
    onCompleteBlock() //fetch data in main thread use main MOC 
}) 
+0

さて、私は個人的なMOCの実行ブロックに挿入と削除を移動し、うまく動作しているようです。しかし、私はすべてをリフレッシュするとき(webserviceに接続し、削除し、コアデータに挿入する)1つの問題があります。その後、フェッチを実行して数秒間nilを返します。新しいデータが挿入される前に、削除がメインコンテキストに保存されているようです。 – user3687

+0

メインMOCでは、privateMOC.save()の後に完全なコールバックブロックを追加し、メインスレッドからメインMOCを使用してデータを読み取ります。または、メインMOCのNSFetchResultControllerを使用して、CoreDataで変更されたデータを観察できます。 – Hao

4

メインのコンテキストからメインスレッドをフェッチしますか?

インポートするには、メインスレッドでセッションコールバックを実行せず、バックグラウンドキューで実行してください。新しいプライベートコンテキストを作成し、その親としてmainを設定します。セッションコールバックでは、ブロックインタフェースを使用してバックグラウンドコンテキストをインポートしてから、その親を(ブロックインタフェースを使用して)インポートして保存します。

+0

バックグラウンドスレッドでセッションコールバックをディスパッチしてMainThreadへの挿入を継続しようとしましたが、MainContextのSaveContextに関するいくつかの問題に直面しました。 「ブロックインターフェイスを使用してインポートする」ということは、正確にはどういう意味ですか?私はあなたをかなり理解していませんでした。 – user3687

+0

NSManagedObjectContextは安全な方法で実行されるコードを提出するためのブロックインターフェイスを提供します – Wain

+0

これにより、データをコアデータに挿入する際にメインスレッドがブロックされ、UIが応答しなくなります。私は削除と挿入が別のスレッドで実行する必要がありますと思います。しかし、私が取ったデータは時々間違っていて、そのようなフェッチは完全には実行されません。 – user3687

関連する問題