2016-08-17 1 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 코드를 기반으로합니다 (예 : try/catch 항목이 주위에 던져졌습니다.) 예를 들어,이 링크 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를 취득 할 필요가 여기에있다. 그런 다음 영구적 인 ObjectId를 사용하여 부모 컨텍스트 내에서 개체를 검색 할 수 있습니다.

관련 문제