2012-08-03 17 views
3

나는이 문제에 대해 생각할 수있는 모든 가능한 해결책을 시도하는데 며칠을 보냈지만 아무것도 작동하지 않는 것 같습니다.코어 데이터와 함께 다중 컨텍스트를 사용할 때 오류 133000

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) { 

        Media *localMedia = [media inContext:localContext]; 

        UIImage *image = localMedia.thumbnail; 


        dispatch_async(dispatch_get_main_queue(), ^{ 

         [thumbnails setObject:image forKey:[NSNumber numberWithInt:i]]; 
         [contentDict setObject:thumbnails forKey:@"MediaItems"]; 
         [cell.entryView setNeedsDisplay]; 
        }); 

       }]; 

또는이 같은 :

dispatch_queue_t cellSetupQueue = dispatch_queue_create("com.Journalized.SetupTimelineThumbnails", NULL); 
      dispatch_async(cellSetupQueue, ^{ 

       NSManagedObjectContext *newMoc = [[NSManagedObjectContext alloc] init]; 
       NSPersistentStoreCoordinator *coordinator = [NSManagedObjectContext contextForCurrentThread].persistentStoreCoordinator; 
       [newMoc setPersistentStoreCoordinator:coordinator]; 

       NSNotificationCenter *notify = [NSNotificationCenter defaultCenter]; 
       [notify addObserver:self 
          selector:@selector(mergeChanges:) 
           name:NSManagedObjectContextDidSaveNotification 
          object:newMoc]; 

Media *localMedia = [media inContext:[NSManagedObjectContext contextForCurrentThread]; 

         UIImage *image = localMedia.thumbnail; 


         dispatch_async(dispatch_get_main_queue(), ^{ 

          [thumbnails setObject:image forKey:[NSNumber numberWithInt:i]]; 
          [contentDict setObject:thumbnails forKey:@"MediaItems"]; 
          [cell.entryView setNeedsDisplay]; 
         }); 

        }]; 

이 둘 다있는 UIImage뿐만 전무 객체를 반환하고, Cocoa Error 133000로 나에게 충돌을주고

는이 같은 배경 스레드를 실행합니다.

다른 모든 백그라운드 스레딩 코드를 제거하고이를 확인하기 위해 주 스레드에 직접 저장했습니다. 위의 코드를 주 스레드에서 실행해도 작동하지만 내 UI는 멈 춥니 다. 이러한 모든 노력에도 불구하고 위의 코드는 매번 충돌합니다.

이 작업을 수행하기 위해 무엇을해야할지 모르겠습니다.

편집 :

내 질문은, 구체적으로 어떻게 충돌없이이 일을해야합니까입니까? 그것은 하나의 컨텍스트에서 다른 개체에 존재하지 않는 개체에 문제가있는 것처럼 보이지만 어떻게 그들을 다른 컨텍스트에서 존재하게합니까?

+0

귀하의 질문은 무엇입니까? RestKit을 사용하고 있습니까? 그리고 코드 스 니펫은 매우 불완전합니다. 나는 어떤 것도 따라갈 수 없습니다. Observer 메서드는 거의 확실하게 원하는 것이 아니며 saveInBackgroundWithBlock 내부의 무언가로 인해 첫 번째 예제가 충돌 할 수 있습니다. –

+0

코어 데이터가 스레드로부터 안전하지 않기 때문에 이런 일이 발생할 수 있습니다. 시도해 봤어 [localContext performBlock :^{}]; –

+0

@PauldeLange RestKit을 사용하고 있지 않습니다. 대신에 관찰자 방법으로 무엇을 가져야합니까? – Andrew

답변

1

빠른 대답 :

NSManagedObjectReferentialIntegrityError = 133000, // 존재하지 않는 개체를 가리키는 오류를 발사 시도

(우리가 가게를 볼 수 있습니다, 우리는 객체를 볼 수 없습니다)

편집 : 코드에서 뭔가보기가 어렵습니다. 관리 대상은 무엇입니까?

다른 컨텍스트에서 한 컨텍스트의 임시 개체를 사용하고있는 것이 문제라고 생각합니다.

+0

공정한 질문은 결코 없었지만 대답이 아닙니다. –

+0

@PauldeLange 오류 코드가 무엇을 의미하는지조차 알지 못한다는 인상을 받았으므로 코드를 살펴보기 전에 오류 설명을 추가하는 것이 가장 먼저 일어났습니다. – Sulthan

+0

그리고 어떻게 객체를 비 일시적으로 만들 수 있습니까? – Andrew

2

MR_inContext : 메서드는 커버 아래에 [NSManagedObjectContext objectWithID :] 메서드를 사용하고 있습니다. 당신은 확실히 당신의 개체를 가지고 있는지 확인하려면이 보일 것입니다 :

1) 2)이 방법은 뭔가 유용한 난

을 반환하는 첫 번째 코드 블록의 배경 컨텍스트/블록에 들어가기 이전에 저장 또한 미리보기 이미지 속성을 설정하는 방법을 잘 모릅니다. 이상적으로 NSTransformable 코드를 작성하는 것이 중요합니다 (변환 가능한 속성을 사용하여 코어 데이터에 UIImage를 저장하는 방법을 보여주는 인터넷 샘플이 있음)

또한 코드는 다음과 같아야합니다. :

UIImage *image = nil; 
[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) { 

    Media *localMedia = [media inContext:localContext]; //remember, this looks up an existing object. If your context is a child of a parent context that has contains this, the localContext should refresh the object from the parent. 

    //image processing/etc 

    image = localMedia.thumbnail; 

} completion:^{    

    [thumbnails setObject:image forKey:@(i)]; //new literals are teh awesome 
    contentInfo[@"MediaItems"] = thumbnails; //as is the new indexer syntax (on the latest compiler) 

    [cell.entryView setNeedsDisplay]; 

}]; 
+0

"첫 번째 코드 블록에서 백그라운드 컨텍스트/블록에 들어가기 전에 저장되었습니다"라는 것이 내 문제였습니다. 백그라운드 스레드에서 주 스레드에 아직 저장되지 않은 항목을 가져 왔습니다. – kabucey

관련 문제