これは、同時にUI、CoreData、Networkを使用したアプローチの理解に関する質問です。私のアプリケーションに関するいくつかの言葉:それはCoreDataによって保存されたタスクの単純なリストであり、TCPプロトコル上の変更を検索/送信する。 UIViewController
とデリゲートNSFetchedResultsControllerDelegate
として存在するタスクの一覧。iOS CoreData with Network and multiple threads
私はAppDelegate
でCoreDataスタックを初期化し、私のUIViewController
にmanagedObjectContextのインスタンスを渡さ:
lazy var managedObjectContext: NSManagedObjectContext = {
let coordinator = self.persistentStoreCoordinator
var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
私は慎重にabout CoreData Concurrencyを読んで、私はスレッド間NSManagedObject
のインスタンスを渡すべきではありませんし、メインの外にプライベートれるMOCを使用する必要があることに気づきました糸。私はこの方法でいくつかの問題を持っている
func processObject(objectID: NSManagedObjectID, callback:() -> Void){
let privateMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateMOC.parentContext = self.managedObjectContext
privateMOC.performBlock {
if let object = privateMOC.objectWithID(objectID) as? MyItem {
object.someProperty = "SomeValue"
do {
try privateMOC.save()
} catch { /* Something to say our user */ }
}
}
}
:だから私singletoneネットワークオブジェクト内のアプリケーションは、私は私を保存する必要があるいくつかのデータを受け取ったとき(メインmanagedObjectContext
へのリンクを持っている)、実際にこのような何かを行います主な質問は:すべてのネットワークイベントで新しいプライベートMOCを作成し、私のアクションをperformBlock
にするか、ネットワークオブジェクト全体に対して1つのプライベートMOCで十分でしょうか?
そして、実際には、私はそれが[ここに記載されている](http://stackoverflow.com/a/19328477/2417790)のような両方のコンテキストを保存した後にのみ、すべてが機能し始めていることに気付きました。それは合法ですか? –
プライベートMOCが正しいスレッドからアクセスできるかどうかをチェックしたい方には[この素晴らしい記事を読む](https://pawanpoudel.svbtle.com/fixing-core-data-concurrency-violations)を参照してください。 –