2013-03-17 5 views
4

NSPersistentDocument 창에 NSTextView이 있습니다. "이진 데이터"핵심 데이터 필드에 텍스트 필드의 내용을 바인딩하지만 텍스트 뷰에 텍스트를 입력하면 텍스트 뷰가 포커스를 잃을 때까지 문서의 제목 표시 줄에 "편집 됨"이 표시되지 않습니다. 따라서 편집을 끝내면 새 데이터가 저장되지 않습니다.NSPersistentDocument의 NSTextView가 첫 번째 응답자가 없어 질 때까지 더티 플래그를 업데이트하지 않습니다.

NSContinuouslyUpdatesValueBindingOption 플래그를 텍스트보기 바인딩에 전달하면 "편집 됨"이 즉시 나타나지만 긴 문서에서는 성능이 실제로 저하됩니다.

모든 변경시 실제로 모든 텍스트 데이터를 할당하지 않고 저장되지 않은 변경 사항이 있음을 코어 데이터에 알리는 방법은 무엇입니까?

(가 편집 작업이 매우 느리게 만들기 때문에 내가 NSContinuouslyUpdatesValueBindingOption을 사용할 수 없습니다를 제외하고이 질문은 "Binded NSTextField doesn't update the entity until it lose the focus"와 같다.)

답변

1

내가 이해하는 한 이것이 불가능하다고 생각합니다. NSManagnedObject의 속성에 변경 사항을 할당하면 CoreData가 diry 상태 (및 실행 취소 항목)를 관리합니다. 데이터없이 diry를 변경하려고하면 잠재적 인 저장 조작이 작동하지 않습니다.

"The Document Architecture Provides Undo Support for Free"에서 더티 상태 및 실행 취소 지원이 구현되는 방법을 살펴보십시오.

정말 큰 텍스트 문서가있는 경우 CoreData 속성에 저장하지 않는 것이 좋습니다. "Incremental Data Reading and Writing"에서 읽을 수 있듯이 텍스트를 별도의 파일에 저장하고 NSFileWrapper를 사용하는 것이 좋습니다. 적어도이 솔루션을 내 응용 프로그램에 사용합니다.

이것은 btw입니다. CoreData 자체에서 제안하는 것 here "... 그러나 파일 시스템에 BLOB를 리소스로 저장할 수 있고 해당 리소스에 대한 링크 (예 : URL 또는 경로)를 유지할 수 있다면 BLOB를 다음과 같이로드 할 수 있습니다. 필요한 경우 "

NSTextView에 어떤 텍스트가 있는지 잘 모르겠지만"긴 문서 "에 대해 생각하고있었습니다.

0

당신이 당신의 "NSTextView", 당신은 즉시 다음 "insertText:" 방법을 잡을 수 있습니다 서브 클래스 경우 문자가 입력 될 때, 당신이하고있는 무거운 의무 (및 CPU 집중) 바인딩없이 "document Edited" flag of the document을 설정하십시오.

+0

'setDocumentEdited :'는 NSDocument 메소드가 아닌 NSWindow 메소드입니다. 문서의 변경 횟수를 업데이트 할 때 문서에 의해 자동으로 호출됩니다. 문서 기반 앱은'setDocumentEdited :'창을 직접 보낼 필요가 없습니다. (사실'setDocumentEdited :'에 대한 설명이 NSDocument보다 오래되었는지 궁금합니다.) –

+0

저장이 시작될 때 손으로 코어 데이터 모델을 업데이트하기 위해 후크를 추가하는 것이 좋습니다. 코어 데이터는 윈도우의'documentEdited' 플래그가 설정되어 있기 때문에 저장이 필요하다는 것을 알고 있습니까? – alltom