2017-01-17 6 views
1

私は、このコアデータモデルを持っているに関係を挿入します。これは、それが起こる場所である(私はJSONデータを含む配列「値」からデータを読んでいる):適切な方法は、コアデータ

let boissonCave = BoissonCave(context: context) 
[...] 
if let _regionId = values["regionId"] as? Int16 { 
    let region = CoreDataStack.sharedInstance.getRegion(ofId: Int(_regionId)) 
    boissonCave.fromRegion = region 
} 

は、私は別のエラーを取得しています、いずれかのCore Dataはときに私「地域」、またはをフェッチするときboissonCaveの領域から割り当てようとする。それはどちらか

EXC_BAD_ACCESS

'NSInvalidArgumentException', reason: '-[__NSCFSet addObject:]: attempt to insert nil'

あるいは*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFSet: 0x174259c80> was mutated while being enumerated.'

だ私は、これはコアデータが1つのコンテキスト内でリージョンをフェッチし、他にBoissonCaveを挿入しようとすると、コンテキストの問題、である疑いがありますか?これをどのように解決すればよいですか?

答えて

0

CoreDataStackに基づいて。なぜあなたは1つの静的コアデータスタックを使用しないのですか?必要に応じて子コンテキストを作成します。子への変更は常にメインコンテキストにマージできます。

- まず、私は確信して作られた私のRegionをすることを:これは、iOSが10.0

class CoreDataStack { 

    static let shared = CoreDataStack() 

    lazy var persistentContainer: NSPersistentContainer = { 
     let container = NSPersistentContainer(name: "Almanapp") 
     container.loadPersistentStores(completionHandler: { (storeDescription, error) in 
      if let error = error { 
       fatalError("Unresolved error \(error)") 
      } 
     }) 
     return container 
    }() 

    var context : NSManagedObjectContext { 
     return self.persistentContainer.viewContext 
    } 

    func saveContext() { 
     let context = persistentContainer.viewContext 
     if context.hasChanges { 
      do { 
       try context.save() 
      } catch let error as NSError { 
       fatalError("Unresolved error \(error), \(error.userInfo)") 
      } 
     } 
    } 
} 
+0

ありがとうございますが、 'if let'構文は' _regionId'がnilにならないようにしているので、問題ではないかもしれません。 –

+0

2つのオプションを連鎖しています。 1つは辞書からの値です。それは辞書にそのような価値がないかもしれないので、常にオプションです。もう一方はそれを解析していますか? Int16もオプションです。 letはそれらのうちの1つだけを置き換えます。私はあなたのための迅速な遊び場のテストで私の答えを適応させます。 – Emptyless

+0

あなたはどこに行くのか分かりません。私が間違っていると誰かが私を修正しますが、 'if let'構文は、' = 'の後の値が実際にはnilであれば、囲まれたコードが実行されるのを防ぎます。あなたの遊び場の例では、[そのために2番目の 'print'は決して実行されません](http://i.imgur.com/JoGejTA.png)です。あなたの 'dict'に' '文字列' 'を探しているのと同じです。何か不足していますか? –

0

だからトリックは2つの物事の組み合わせだったやったので、私が使用していること上記のURLから非常にわずかに修正したバージョンですそしてSousRegionオブジェクトは、(あなたはもちろん、両方の挿入のために同じコンテキストを使用する必要があります)context.performAndWait { ... }の間、私の挿入コードをラップすることによって、私のBoissonCaveオブジェクトの前に挿入された

-Iのような私のコンテキスト内のポリシーをマージ追加:

lazy var viewContext: NSManagedObjectContext = { 
    self.persistentContainer.viewContext.mergePolicy = NSMergePolicy.mergeByPropertyObjectTrump 
    self.persistentContainer.viewContext.automaticallyMergesChangesFromParent = true 
    try! self.persistentContainer.viewContext.setQueryGenerationFrom(.current) 

    return self.persistentContainer.viewContext 
}() 

私はクラッシュしていませんでした。