문제

UI가 SQLITE 데이터 저장소로 외부 변경 (다른 프로세스로 제작)을 반영하기 위해 UI를 얻는 데 어려움이 있습니다.

상당히 표준적인 핵심 데이터 기반 NSARRAYCONTROLLER / TABLE보기가 있습니다. 내 앱은 데이터에 대한 외부 변경이 이루어 졌다는 사실을 알게되며,이 시점에서

[managedObjectContext reset]; // brute force, but data set is small

문제는이 작업을 수행하면 테이블에서 모든 데이터가 지워집니다. 배열 컨트롤러의 배열 도식도 비어 있습니다. 나는 후속이라고 생각했다

[arrayController fetch:nil];

도움이 될 수 있지만 그렇지 않습니다. ManagedObjectContext에서 Fetch 요청을 실행하면 데이터가 존재하고 업데이트되었으므로 ManagedObjectContext는 변경 사항에 대해 알고 있습니다.

재설정에서 "복구"하는 방법에 대한 단서가 있습니까? 또는 재설정 접근 방식이 완전히 잘못되었을 수 있습니다.이 경우 외부 변경을로드하는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

두 프로세스가 동일한 핵심 데이터 데이터베이스에서 작동해야한다고 생각하지 않습니다. 한 프로세스가 데이터베이스를 소유하고 열리는 서버 역할을하고 다른 프로세스가 데이터베이스를 소유하고 다른 하나가 변경 명령을 보내도록하는 것이 좋습니다. 핵심 데이터가 동일한 DB와 대화하는 여러 프로세스를 지원하기위한 적이 없다고 생각합니다.

다른 팁

그래서 나는이 정확한 상황을 가지고 놀았으며, 첫 번째 대답과 모순되지 않을 것입니다. 아마도 당신은 아마 이것을하지 말아야 할 것입니다. 이 코드를 사용하지 마십시오. 나는 다른 사람들이 내가 고치지 않은 모든 문제를 발견하고 계속 진행할 수있는 시점에 도달하도록 돕기 위해 그것을 제공합니다.

즉, 원래 질문이 원하는 일을 할 수 있습니다. 컨트롤러가 디스크에서 다시로드하도록 강요합니다.

// Tear down bindings and context, create new context & rebind
[self.watcherAC unbind:@"managedObjectContext"];
[self saveAction:self]; // Optional, dependent on NSMergePolicy, etc
self.managedObjectContext = [[NSManagedObjectContext alloc] init];
self.managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
[self.managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
[self.watcherAC bind:@"managedObjectContext" toObject:self withKeyPath:@"managedObjectContext" options:nil];

// Force controller to refetch and rearrange
NSError* error;
[self.watcherAC fetchWithRequest:nil merge:NO error:&error];  // Immediate fetch
[self.watcherAC prepareContent];
[self.watcherAC rearrangeObjects];

디스크의 상점에서 TableView의 콘텐츠를 새로 고침합니다. (테이블 뷰는 Watcherac 어레이 컨트롤러에 바인딩됩니다)

나는 그것을 발견했다 가져 오기 : 즉각적인 것이 아닙니다- 다음에 응용 프로그램의 런 루프를 통해 이루어집니다. 따라서 올바른 순서로 가져 오기 / 재 배열을 수행하려면 FetchWithRequest를 사용해야합니다.

컨트롤러 컨텐츠의 결함을 정리하는 데 도움이되었지만 준비가 필요합니다.

TableView 선택을 복원 할 수는 없었지만 TableView Delegate Call 내 에서이 작업을 수행하기 때문에 View의 선택은 해킹을 시도하든 컨트롤러 선택과 동기화되지 않습니다. 아마도 이것은 누군가에게 효과가있을 수 있지만, 나는 당신의 견해에 구속력이있는 후에 새로운 MOC를 할당하지 않는 방법을 알아내는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top