2014-02-06 1 views
0

나는이 간략한 내용을 유지하려고 노력할 것이다. 그러나 기본적으로 특정 모드에서 위치 및 기타 데이터를 거의 연속적으로 기록 할 수있는 앱을 사용하고있다. AVFoundation)에 저장하고 Core Data에 저장하십시오. 의심스러워서이 모든 것을 스레드해야 할 필요가 있음을 발견했습니다. 그렇지 않으면 UI가 매우 느려집니다.코어 데이터 멀티 스레딩 - 내가 뭘 잘못하고 있니?

내가 코어 데이터를 동시성과 결합 시키려고 한 적은 한번도 없었습니다. 그래서 최선을 다해 읽었습니다. 내가 뭘해야 하는지를 이해하고있는 것처럼 느껴지지만, 누군가 옳은 이유로 그것을 이해합니다. 이 오류로 인해 충돌이 발생합니다. "서로 다른 컨텍스트의 개체간에"managedDataPoint "관계를 설정하려는 잘못된 시도.이게 무슨 뜻인지는 알지만, 아래에있는 내용은이 문제를 피할 것이라고 생각했습니다 (읽은 내용을 따르고 있습니다). . 내가 메인 컨텍스트에서 객체 ID 참조를 얻은 다음, 객체에 대한 새로운 참조를 가져 와서 "temp"컨텍스트에 전달하는 데 사용합니다 ...하지만 핵심 데이터로 작동하지 않습니다. 컨텍스트 (?)에 걸쳐 관계를 만들려고. 어떤 도움을 주셔서 감사이. 감사합니다!

-(void)snapPhotoForPoint:(ManagedDataPoint*)point 
{ 

if (!_imageCapturer) 
{ 
    _imageCapturer = [[ImageCapturer alloc] init]; 
} 

if (!_tempContext) { 
    _tempContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
    _tempContext.parentContext = self.managedObjectContext; 
} 

__block NSManagedObjectID* pointID = [point objectID]; 

[_tempContext performBlock:^{ 

    NSError *error = nil; 

    Photo *newPhoto = [NSEntityDescription insertNewObjectForEntityForName:@"Photo" inManagedObjectContext:_tempContext]; 
    UIImage *image = [_imageCapturer takePhoto]; 
    newPhoto.photoData = UIImageJPEGRepresentation(image, 0.5); 

    ManagedDataPoint *tempPoint = (ManagedDataPoint*)[self.managedObjectContext objectWithID:pointID]; 
    newPhoto.managedDataPoint = tempPoint; // *** This is where I crash 

    if (![_tempContext save:&error]) { // I never get here. 
     DLog(@"*** ERROR saving temp context: %@", error.localizedDescription); 
    } 
}]; 
} 
+0

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Concurrency.html –

답변

1

ManagedDataPoint *tempPoint = (ManagedDataPoint*)[self.managedObjectContext objectWithID:pointID]; 

하지 안

ManagedDataPoint *tempPoint = (ManagedDataPoint*)[_tempContext objectWithID:pointID]; 

그렇지 않으면 다른 컨텍스트로 작업하고 있습니다! 또한 objectID가 임시 ID인지 확인하고 "final"ID를 획득해야합니다.

+0

하지만 필요한 객체는 주 컨텍스트에 있습니다! 메소드의 맨 위에서 전달됩니다. 어쩌면 이걸 제대로 이해하지 못하고있는 것 같아요? 필요한 객체가 생성되어 주 컨텍스트에 존재하는 경우, "temp"컨텍스트에서 검색하는 방법은 무엇입니까? 나는 이미 저장하지 않고 메인에서 임시로 푸시하지 않으면 거기에있을 것이라고 생각하지 않습니다. 그리고 다른 방법으로 이동하려고합니다 (임시에서 메인으로). –

+0

objectID를 사용하고 _tempContext에서 포인트 객체를 가져 와서 동일한 컨텍스트 내에서 관계를 설정할 수 있습니다. 당신이 묘사 한대로 그리고 문서화 된대로. – Volker

+0

음 ... 나는 그것을 소용돌이 치고 적어도 나는 더 이상 충돌하지 않는다. 내가 테스트하지 않았기 때문에 그것이 "일하는"일인지는 모르겠다. 정보를 주셔서 대단히 감사합니다 ... 나는 아직도 이해하기 힘들다. 하나의 컨텍스트에서 객체에 객체 ID를 사용하고 그 ID를 사용하여 다른 컨텍스트를 쿼리하면 그 객체는 두 번째 컨텍스트에 존재하지 않으므로 오류가 발생하고 두 컨텍스트가 영구 저장소? –

관련 문제