2016-11-23 11 views
0

これは、同時に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で十分でしょうか?

+0

そして、実際には、私はそれが[ここに記載されている](http://stackoverflow.com/a/19328477/2417790)のような両方のコンテキストを保存した後にのみ、すべてが機能し始めていることに気付きました。それは合法ですか? –

+0

プライベートMOCが正しいスレッドからアクセスできるかどうかをチェックしたい方には[この素晴らしい記事を読む](https://pawanpoudel.svbtle.com/fixing-core-data-concurrency-violations)を参照してください。 –

答えて

0

CoreDataの「銀行」は1つだけであるため、グローバルMOCが1つ必要です。私はこの問題を抱えていましたが、はい、複数のプライベートインスタンスを使用することができますが、2つのスレッドまたはイベントが同時にデータにアクセスしたり、データを変更したりしないようにする必要があります。これを緩和するためにセマフォーを使うこともできますが、シンプルで簡潔にするためには、グローバルMOCを1つ使用します。

+0

私はただ1つのMOCを使用することを考えていますが、ここでの主な問題は、1つのスレッドからのみこのMOCにアクセスし、私のアーキテクチャではそれほど簡単ではありません。私は子供と付き合ったMOCが自動的にこの衝突を解決することができると私はどこかを読んで、私は手動でそれを気にする必要がある場合、私はそのようなアプローチの利点を理解することはできません。 –