2016-08-17 7 views
1

iOSの親/子管理対象コンテキストに問題があります。私は、一時的な子管理対象オブジェクトコンテキストを使用することを標準的な使用例として思い出します。そのため、save()コールを使用して保存を押して変更を親に伝播させることも、子プロセスに放棄することもできますMocが消える。子オブジェクトからオブジェクトを保存NSManagedObjectContextは親では使用できません

childMoc = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) 
childMoc.parentContext = parentMoc 

をそして私は、私はすべての必要な変数として、私のピカピカの新しいオブジェクトを移入が完了した後

let objectInChildMoc = NSEntityDescription.insertNewObjectForEntityForName(... 

を使用してchildMocでオブジェクトを作成します。

は、私はこのような子供を作成しますいくつかの依存オブジェクトを取得するには、このコードをSwiftで使用して、親コンテキストから新しいオブジェクトにアクセスしようとします。

childMoc.performBlock({ 
    do { 
     try childMoc.save()  
     parentMoc.performBlock({ 
      do { 
       try parentMoc.save()     
       do { 
        let objectInParentMoc = try parentMoc.existingObjectWithID(objectInChildMoc.objectID) as? TheRightType     
       } catch { 
        print("Couldn't find object in parent") 
       }  
      } catch { 
       print("Couldn't save parent") 
      } 
     }) 
    } 
    catch { 
     print ("Couldn't save child") 
    } 
}) 

私はいつも「親にオブジェクトを見つけることができませんでした」というメッセージが表示されます。私は何が欠けていますか?私は、NSManagedObjectContext保存通知を使用する古いサンプルコードを参照してくださいが、私はそれらが親子のマネージドオブジェクトコンテキストではもう必要ではないことを読んでいます。上記のコードは、最近のObjectiveCコードに基づいています。しかし、このリンクCorrect implementation of parent/child NSManagedObjectContextは、上記の設定がうまくいくはずであることを私に示唆しています。

+0

明確にするために、オブジェクトは親のMOCに保存されています。私が後でフェッチすると、私はそれを見つける。したがって、existingObjectWithIDは、親のManaged Object Context内のオブジェクトを見つける間違った方法のようです。 –

+0

私は 'existingObjectWithID'呼び出し全体をスキップしようとしましたが、コードがオブジェクトを削除しようとするまでは動作しているようですが、間違ったコンテキスト内からオブジェクトを削除しなければならないという不満があります。 –

答えて

0

申し訳ありません、それはバグです!何年もの間知られていたバグですが、StackOverflowでのみ書かれています。答えはここにある https://stackoverflow.com/a/11996957/2073793

一つはは子コンテキストに保存する前に obtainPermanentIDs(for:) を使用して永続的なオブジェクトIDを取得する必要があります。次に、これらの永続ObjectIdsを使用して、親コンテキスト内からオブジェクトを取得できます。

関連する問題