다음 작업을 수행하려고합니다.NSFetchedResultsController 및 백그라운드 컨텍스트가있는 UIManagedDocument
테이블 뷰에서 API에서 가져온 데이터를 표시하는 테이블 뷰가 있습니다. 이를 위해 나는 NSFetchedResultsController를 사용하고 있습니다 :
는self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.database.managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
이 같은 배경의 맥락에서 내 실체를 만들 : 지금
NSManagedObjectContext *backgroundContext;
backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
backgroundContext.parentContext = document.managedObjectContext;
[backgroundContext performBlock:^{
[MyAPI createEntitiesInContext:backgroundContext];
NSError *error = nil;
[backgroundContext save:&error];
if (error) NSLog(@"error: %@",error.localizedDescription);
[document.managedObjectContext performBlock:^{
[document updateChangeCount:UIDocumentChangeDone];
[document.managedObjectContext save:nil];
}];
내가 새로운 데이터를 얻을 수 (및 삽입 할 때마다/업데이트 실체를 바로 표시처럼 위), 내 NSFetchedResultsController 꽤 작동하지 않습니다해야합니다. 특히, 나는 항상 하나의 엔티티 (새로운 엔트리를 생성하지 않음)를 업데이트하지만, 내 테이블 뷰는 두 엔티티를 보여줍니다. 앱을 다시 시작하면 올바르게 표시됩니다.
self.database.managedObjectContext에서 엔티티 ([MyAPI createEntities])를 생성하면 모든 것이 잘 동작합니다.
내가 뭘 잘못하고 있는지 알기! 여기에있는 기존 스레드를 살펴보면 내가 올바른 방법으로하고 있다고 생각하게 만듭니다. 다시 말하지만, 핵심 데이터가 백그라운드 컨텍스트 (하지만 document.managedObjectContext)에 저장되지 않으면 잘 작동합니다 ...
흠을, 나는 생각 서로 다른 컨텍스트의 변경 사항이 병합되므로 fetchedResultsController가 결국 알림을 받게됩니다. 어쨌든 backgroundContext를 저장 한 후에도 [self.fetchedResultsController performFetch : nil]을 호출 해 보았습니다.하지만 여전히 동일한 상황이 있습니다. 내 테이블 뷰는 두 개의 엔티티를 표시합니다. 응용 프로그램을 다시 시작한 후 제대로 작동합니다. – user1013725
또한 UIDocument가 있다는 것을 기억하십시오. 기본적으로 백그라운드 스레드에서 새 엔티티를 내 문서에 저장/업데이트하려고합니다. UIDocument의 managedObjectContext에 저장을 수행하면 UI가 뒤처집니다. 그래서 backgroundContext를 사용하여 작업을 시도했지만 어떻게 든 엉망이되거나 병합되지 않습니다. 나는 이제 꽤 절박 해지고있다. – user1013725
아쉽게도 코드가 여전히 작동하지 않습니다. 그것은 나에게 완전히 이상하고 예측할 수없는 결과를 준다. 어떤 상황에서 배경 컨텍스트를 사용한 다음 저장을 호출하고 해당 배경 컨텍스트에 대한 영구 ID를 얻는 것이 었습니다. 그러나 두 번 다른 컨텍스트에서 엔터티를 만든 다음 병합하기 때문에 해당 업데이트 코드가 동시에 두 번 호출되면 경쟁 조건 문제가 발생합니다. 그것을 방지하는 방법을 모릅니다. – user1013725