0

여러 개의 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가 생성 된 스레드에 묶여 있어야하므로 이미지가 있어야합니다. 내가 잘못 가고있는 곳을 가리키는 포인터가 도움이된다고 생각합니다.

+0

모든 작업에서 사용되는 것과 동일한 'adHocManagedObjectContext'입니까? MOC가 스레드로부터 안전하지 않기 때문에 작업이 병렬로 실행되는 경우 문제가됩니다. –

+0

@MartinR 안녕하세요, 나는 그 코드도 추가했습니다. 각 호출마다 동일한 영구 저장소 코디네이터로 새 MOC를 만듭니다. – rob5408

+0

MOC 설정이 나에게 잘 들립니다 (스레드 당 생성됨). 문제의 본질을 자세히 설명해 주시겠습니까? A ​​급 작성 후 B 급 작성이란 무엇입니까? 누락 된 품목이 있습니까? (관찰자를 삭제하는 것을 잊지 마십시오). –

답변

0

귀하의 문제를 이해할 수 있는지 확실하지 않습니다 (국가 또는 도시가 누락 되었습니까? 잘못된 주문입니까? 'clobbered'의 예를 들어주십시오). 귀하의 질문에 관해서는

:

호출되고있는 선택의 MOC을 만드는 어떤 문제가 있습니까?

아니요, 문제가 없습니다. 설명서에서는 사용하려는 스레드에서만 만들어야한다고 말합니다 (startmain은 작업 스레드에서 실행되는 메서드입니다). 따라서 NSInvocationOperation은 작업 스레드에서 메서드를 실행할 것이므로 걱정없이 MOC를 만들 수 있습니다.

+0

때로는 하나의 도시가 만들어지고 그 다음에 200 개의 국가가 보일 것입니다. 앱을 삭제하고 다시 시도하면 아마 한 개의 국가와 200 개의 도시가 표시됩니다. 그래서 JSON을 반복하고 새로운 객체를 만드는 코드를 작성했습니다.때로는 여러 도시를 만든 후 상황을 병합 한 후에도 유지되지 않는 경우가 있습니다. 서로 다른 스레드에 같은 (기본) 유형의 객체를 생성하고 모든 작업을 마치면 완료 될 수 있어야합니다. 나는 그것을 계속 실행하고 패턴이 나타나는지 봅니다. – rob5408

+0

컨텍스트를 저장할 때 데이터가 손상되는 문제는 알지 못합니다. 생성하는 동안 그리고 저장하기 전에 (컨텍스트의 삽입, 삭제, 갱신 된 업데이트 된 콜렉션)'createObjectWithObject : inManagedObjectContext :'에서 생성 한 객체를 출력하고 저장하기 전에 생성 한 모든 객체가 저장되어 있는지 확인하는 것이 좋습니다. 저장하기 전에 컨텍스트에서 모든 개체를 볼 수 있고 여전히 DB에서 누락 된 경우 (오류가없는 경우) 문제가 발생할 수 있습니다. –

+0

안녕하세요 댄, 어젯밤에 이걸 50 번이나 더 돌렸고 다른 날을 보지 못했습니다. 무엇이 변경되었는지 확실하지 않습니다. 당신의 도움을 주셔서 감사합니다! – rob5408

관련 문제