2017-09-08 14 views
0

NSManagedObject 개체를 임시 NSManagedObject 개체로 복사했습니다. 그래서 사용자 입력에 변화가 없다면 임시 NSManagedObject 객체를 사용할 수 있습니다. 그렇지 않으면 실제 NSManagedObject 개체를 사용할 수 있습니다.NSManagedObject를 스위프트의 임시 NSManagedObject로 복사

실제 NSManagedObject 개체의 값을 변경하면 임시 NSManagedObject 개체에 자동으로 반영됩니다. 인터넷에서 검색했을 때 NSManagedObjectNSCopying 프로토콜을 따르지 않는다고합니다. 또한 복사 된 객체는 실제 NSManagedObject 객체에 대한 참조를 갖습니다.

이 문제를 극복하는 방법이 있습니까?

+0

** 정확하게 ** 복사하는 방법 ** 하나의 대상을 다른 대상으로? –

답변

1

임시 NSManagedObject이 필요한 이유를 알고 있으면 도움이된다고 생각합니다.

NSManagedObject과 같은 클래스는 참조 유형입니다. 즉, 원본 및 임시 개체가 메모리의 동일한 주소를 참조하고 하나의 변경 내용이 다른 주소에 반영됩니다.

그러나 구조체는 값 형식입니다. 어쩌면 관리 객체로 초기화 할 수있는 구조체를 생성하고이를 사용하여 일시적으로 보관해야하는 데이터를 저장할 수 있습니다.

또한 NSManagedObject에 해당하며, 은 임시적으로입니다. 관리 대상 개체의 속성을 변경하면 관리 대상 개체 컨텍스트가있는 영구 저장소에 쓰기 전까지 유지되지 않습니다.

0

음, 엄밀히 말하자면, 그렇습니다. 해당 엔티티 유형의 관리 객체 컨텍스트 새 객체를 작성하고 모든 등록 정보를 하나씩 새로 작성한 객체로 복사하십시오.

let objCopy = NSEntityDescription.insertNewObject(forEntityName:<#entityName#>, into:<#context#>) 

objCopy.propertyA = objOrigin.propertyA 
objCopy.propertyB = objOrigin.propertyB 
... 

는 그러나 문맥의 내부 관리 객체 대처의 매우 전제는 나에게 약간 모호한입니다. NSManagedObject는 실제 데이터의 일부 임시 상태를 반영합니다. 따라서 개체에 대한 변경 사항을 취소해야하는 경우 언제든지 변경할 수 있습니다. 관리 대상 객체 컨텍스트, 변경된 객체, 변경된 속성에 대해 관리 객체에 요청할 수 있습니다.

따라서 응용 프로그램 디자인을 검토해야합니다. 확실히, 당신은 당신의 임시 사본을 가질 필요가 없습니다.

복사본이 임시 성이 아니며 영구 저장소에 저장해야하는 경우 수동으로 속성에 따라 복사해야합니다 (내 대답의 첫 부분을보십시오). 이러한 대처의 경우 결정할 별도의 과제, 참조로 수행 할 작업 (원본 참조) 또는 원본과 동일한 개체를 계속 참조하십시오.