は、それがバックグラウンドマルチスレッドの問題に対処するためにSwift 3では、コアデータの並行性がマルチスレッドでどのように機能しますか?私のプログラムで
DispatchQueue.global(qos: .background)
と
self.concurrentQueue.sync(flags: .barrier)
の両方を使用しています。私もその後
問題が発生するデバッグする-com.apple.CoreData.ConcurrencyDebug 1
を有効
lazy var context: NSManagedObjectContext = {
return (UIApplication.shared.delegate as! AppDelegate).persistentContainer.newBackgroundContext()
}()
:
3はので、私はchildContextを取得するには、最新の方法を使用して迅速である
1、がありますAPIコールとコールバックブロック(バックグラウンドスレッド)で、私はコアデータをフェッチし、編集してから保存する必要があります。上記のコードからself.contextを使ってperformBlockAndWait
を呼び出して、このブロックの内部にsave
を書き込もうとしました。プロセス全体は正常ですが、このブロックの外側でコールバックブロックの内部にアクセスしようとすると、エラーが発生します。私もobjectIdとgetObjectById
をself.contextとself.context.parentの両方で取得しようとしましたが、この行でエラーが発生します。私は何が間違っていたのですか?これをどうすればいいですか?なぜなら私は多くの異なるスレッド(コンテキストではない)で結果をどこでも使う必要があるからです。
2、投稿ごとにスレッドごとに1つのコンテキストが必要だと言っていますが、私の場合、APIコールからのコールバックであれば、どのスレッドを正確に判断するのですか?
3私のプログラムはバックグラウンドスレッドで実行する必要があるため、このようにしなければならないので、なぜprivateConcurrentTypeが必要なのかを尋ねるかもしれません(他の投稿から読んでください)。
4私の質問でも、objectIdを別のContextに渡してオブジェクトを取得しても、私の場合は動作しません。これが正しい方法だとしましょう。どのように私は非常に乱雑ではなく、別のスレッドで私のプログラム全体を通して非常に多くのobjectIDを渡すことを管理するつもりですか?私にとっては、これは狂ったように聞こえるが、これに対処するためにもっとクリーンで簡単な方法があると思う。
5、いくつかの記事はかなり古くなっています(スワイプ3より前)childContext.save
parentContext.save
がありますが、私は上記のコードを使用しています(swift 3のみ)。私はそれが動作するようにchildContext.saveを行うことができるようですか?私は正しい?
バックグラウンドスレッドのコンテキストにアクセスしようとすると、「エラー」とは何かが発生しますか? –