2016-10-24 1 views
0

私はCore Dataと実行時間の長い計算を持っている:コアデータの計算を停止しますか?

let contextTemporary = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) 
contextTemporary.parent = context 

contextTemporary.perform { 
    //long running calculation 
} 

は、それはそれを停止、それを破る、それを殺すための方法ですか?

+0

私は「abort();」と思います。完了ブロックのループを解除するために使用されます。あなたがその操作を中止したい場合は、ブロックで条件をチェックすることができます。 Contextの以前の状態を返すことは "ロールバック"を使うことができるでしょう – Wolverine

答えて

0

それはあなたがそのブロックで何をしているかによって異なります。言い訳がありません。実行を中止してperformブロックを開始しました。しかし、あなたはそのブロック内のコードを作ることができます

  • は随時(多分cancelという名前のブール値のような)外部のフラグをチェックし、その値が変化した場合に実行を停止します。
  • ブロックが長いフェッチのような処理を行っている場合は、NSAsynchronousFetchRequestの使用を検討してください。これはキャンセルできます。
+0

異なるスレッドからのアクセスフラグはどのくらい危険ですか?私。 1つのスレッドからのみ書き込みますが、多くの異なるスレッドから読み取りますか?私はまだ問題は見つけていませんが、Bernsteinの条件ではこれは許されません。 –

+0

もしあなたがそれを心配しているのであれば、GCDを使って、値を変更したスレッドと同じスレッドでそのフラグを確認することができます。 Swiftの場合は 'Dispatch'、Objective-Cの場合は' dispatch_async'を見てください。 –

関連する問題