여러 개의 NSInvocationOperations를 만들고 NSOperationQueue에 추가했습니다. 이 중 두 개 NSInvocationOperations는 동일한 상위 클래스 (위치를 하위 클래스로하는 국가 및 도시)의 많은 개체를 만듭니다. 그것은 하나의 모델이나 다른 모델에 변화가 있음을 알게 된 것을 제외하고는 대부분 잘 돌아갔다.NSInvocationOperation에 대한 NSManagedObjectContext를 만들 위치
(sqlite 프로그램을 사용하여) 매장을 보면 (아마도 200 개가 넘는) 첫 번째 도시가 생성 된 다음 모든 국가 (다시는 아마 200 개)가 생성 된 것을 볼 수 있습니다. 앱을 삭제하고 다시 실행하면 첫 번째 국가와 모든 도시가 표시됩니다.
나는 문서를 쳤다. 그리고 애플은 당신의 시작 방법으로 스레드 당 MOC를 설정하도록 제안했다. 그러나 NSOperation을 사용하지 않고 NSInvocationOperation을 사용하고 있습니다. 실제로 제가 처음에 MOC를 만들 것을 제안하는 이유에 대해 더 궁금합니다. 이건 내 NSInvocationOperation에 대한 내 선택이다
...
+ (void)load:(NSString *)file
{
NSManagedObjectContext *managedObjectContext = [(OSSMAppDelegate *)[[UIApplication sharedApplication] delegate] adHocManagedObjectContext];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:managedObjectContext];
SBJsonParser *jsonParser = [[SBJsonParser alloc] init];
NSString *json = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:file ofType:@"json"]];
NSArray *objects = [[jsonParser objectWithString:json] valueForKeyPath:@"objects"];
for(NSDictionary *object in objects)
{
[self createObjectWithObject:object inManagedObjectContext:managedObjectContext];
}
NSError *error = nil;
[managedObjectContext save:&error];
} 응용 프로그램 위임에서
...
...- (NSManagedObjectContext *)adHocManagedObjectContext
{
NSManagedObjectContext *adHocManagedObjectContext = nil;
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
adHocManagedObjectContext = [[NSManagedObjectContext alloc] init];
[adHocManagedObjectContext setPersistentStoreCoordinator:coordinator];
[adHocManagedObjectContext setUndoManager:nil];
}
return adHocManagedObjectContext;
}
... 다음 다른 곳 (참고 : firstRun은 load를 호출합니다.) ...
NSInvocationOperation *countryInvocationOperation = [[NSInvocationOperation alloc] initWithTarget:[Country class] selector:@selector(firstRun) object:nil];
[operationQueue addOperation:countryInvocationOperation];
호출되는 선택기에서 MOC를 만드는 데 문제가 있습니까? MOC가 생성 된 스레드에 묶여 있어야하므로 이미지가 있어야합니다. 내가 잘못 가고있는 곳을 가리키는 포인터가 도움이된다고 생각합니다.
모든 작업에서 사용되는 것과 동일한 'adHocManagedObjectContext'입니까? MOC가 스레드로부터 안전하지 않기 때문에 작업이 병렬로 실행되는 경우 문제가됩니다. –
@MartinR 안녕하세요, 나는 그 코드도 추가했습니다. 각 호출마다 동일한 영구 저장소 코디네이터로 새 MOC를 만듭니다. – rob5408
MOC 설정이 나에게 잘 들립니다 (스레드 당 생성됨). 문제의 본질을 자세히 설명해 주시겠습니까? A 급 작성 후 B 급 작성이란 무엇입니까? 누락 된 품목이 있습니까? (관찰자를 삭제하는 것을 잊지 마십시오). –