2

많은 양의 데이터를 가져올 수있는 CoreData를 사용하는 문서 기반 코코아 응용 프로그램이 있습니다. 이 가져 오기 작업은 백그라운드에서 수행하는 데 다소 시간이 걸리지 만 이후 NSManagedObjectContext은 스레드가 저장되지 않기 때문에 문서의 managedObjectContextpersistentStoreCoordinator을 사용하여 백그라운드 스레드에 새 NSManagedObjectContext을 생성했습니다. 이제 가져 오기가 완료되면 배경 managedObjectContext을 저장하여 문서의 주 스레드 managedObjectContext에 변경 사항을 알리고 병합합니다. 내가 아는 한, 이것이 CoreData를 사용하여 동시성을 수행하는 방법입니다.NSPersistentDocument에서 기본 persistentStore/autosave를 강제로 생성하는 방법

하지만 가끔 persistentStoreCoordinator[managedObjectContex save:]이라고 부르면 앱이 중단되고 앱이 중단 될 때 persistentStore이 표시되지 않습니다. 필자는 자동 저장 기능과 모든 기능 (기본적으로 OS X 10.8의 NSPersistentDocument)을 사용하고 있으므로 저장 방법과 "작동 여부"에 신경을 쓸 필요가 없다고 가정했습니다.

분명히 그렇지 않습니다. 내 문서 서브 클래스에서 windowControllerDidLoadNib:의 끝에 [self autosaveDocumentWithDelegate:self didAutosaveSelector:@selector(document:didAutosave:contextInfo:) contextInfo:nil];을 호출하여 persistentStore를 생성하기를 희망하지만 자동 저장 작업을 강제 실행하려고 시도했지만 아무 것도 변경하지 않는 것 같습니다. 위임 콜백 (- (void)document:(NSDocument *)document didAutosave:(BOOL)didAutosaveSuccessfully contextInfo:(void *)contextInfo)은 fileURL 또는 관련 접근자가 임의의 nil이 아닌 값이나 persistentStore가 만들어지지 않았지만 자동 저장에 성공했다고 말합니다.

나 자신도 -(BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError *__autoreleasing *)error을 호출하는 것에 대해 생각했지만 정상적인 자동 저장과 같이 작동하도록하기 위해 어떤 URL을 사용해야할지 모르겠다. backupFileURL, fileURLautosavedContentsFileURL을 확인했지만 모두 windowControllerDidLoadNib:의 끝에서 여전히 0입니다. 사실, 그들은 writeToURL:...configurePersistentStoreCoordinatorForURL:...이 호출 된 후에도 아무 것도 없으므로 "올바른"URL을 얻는 방법을 알지 못합니다.

는 더 잘 이해하는 방법과 때 persistentStore writeToURL:...configurePersistentStoreCoordinatorForURL:...에서 만들어 내가 설정 한 중단 점입니다. 응용 프로그램이 최전방 상태를 잃었을 때 configurePersistentStoreCoordinatorForURL:이 호출 된 것으로 나타났습니다. 그러나 새로운 문서를 생성하고 생성 된 직후에 뭔가 가져 오기를 시도하면 (다른 응용 프로그램으로 전환하지 않고 persistentStore가 생성되게 함) 충돌이 발생합니다. 다른 앱으로 전환하면 상점이 만들어지고 모든 것이 제대로 작동합니다. 그런데이 방법으로 생성 된 persistentStore에 사용되는 URL은 항상 임시 디렉토리의 어딘가에 있습니다.

내가 잘못 했나요? 다른 managedObjectContext에 변경 사항을 알리려면 [managedObjectContext save :]를 호출해야하지 않습니까? 문서를 강제로 임시 persistentStore를 만들 수 있습니까? autosaveDocumentWithDelegate:...에 대한 호출이 실제로 문서를 저장하지 않으므로 (따라서 persistentStore을 생성합니까?)

관련 :

답변

2

나는 비슷한 문제를 해결했습니다. 영구적 인 저장소가 있어야하는 영구적 인 개체 ID를 생성해야합니다. 지적한 바와 같이 아직 자동 저장되지 않은 제목이없는 문서에는 영구 저장소가 없습니다.

이 단축 조각 내 NSWindowController 서브 클래스에서입니다 : 자동 저장을 유도하기 위해 모든 다른 방법이없는 경우

- (void) awakeFromNib { 
    //hacky way to get an autosave to generate an NSPersistentStore. 
    GSNativeDocument *doc = self.document; 
    [doc updateChangeCount:NSChangeDone]; 
    [doc autosaveDocumentWithDelegate:self didAutosaveSelector:@selector(document:didAutosave:contextInfo:) contextInfo:nil]; 
} 

//called by the autosave operation started in awakeFromNib. 
- (void)document:(NSDocument *)document didAutosave:(BOOL)didAutosaveSuccessfully contextInfo:(void *)contextInfo 
{ 
    GSNativeDocument *doc = self.document; 
    [doc updateChangeCount:NSChangeUndone]; 
} 

왜, 변경 횟수가 "진짜"자동 저장을 만들 업데이트는 무엇입니까? 나는 단서가 없다. 저는 1 월 초에이 버그를 Apple에 제기하고 dev 포럼에 게시했지만 답변을하지 않았습니다.

+0

일관성없는 동작 (응용 프로그램을 시작할 때 복원 할 자동 저장된 문서가 있지만 개발자가 액세스 할 수있는 URL이나 영구 저장소가없는 경우)이 발생하므로이 버그를 버그로 처리해야한다고 확신합니다. . 나는 사과와 함께 rdar : // problem/12970136으로 제출했습니다. 그래서 우리는 그것이 무엇이든지 볼 것입니다. – Khakionion