2016-11-21 6 views
0

MagicalRecord를 사용하고 있으며 안정적이고 예측 가능하게 만드는 방법을 이해할 수 없습니다.MagicalRecord로 업데이트를 올바르게 저장하는 방법은 무엇입니까?

- (void) saveEntities:(NSArray *)entities { 
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { 
     for (Entity_class *entityElement in entities) { 
      NSPredicate *entitySearchPredicate = [...] // Composing predicate 
      Entity_class *foundEntity = [Entity_class MR_findFirstWithPredicate:entitySearchPredicate]; 
      foundEntity = entityElement; 
     } 
     [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]; 
    } completion:^(BOOL contextDidSave, NSError *error) { 
     // contextDidSave always equals NO. Sometimes changes get saved, but sometimes they don't    
    }]; 
} 

내가 저장하려고했습니다

좀 엔티티를 업데이트해야

, 내가 DB를 받아옵니다, 나는 내 "보호기"방법으로 그들을 보낸 후, 논리에 따라 변경할 로컬 컨텍스트 [localContext MR_saveToPersistentStoreAndWait] 대신 기본 컨텍스트가 있지만 작동하지 않습니다.

나는 두 번째 밤에 이러한 컨텍스트에 어려움을 겪고 있으며 Google 검색 쿼리 변형이 부족합니다. 컨텍스트를 처리하고 올바르게 저장하는 방법?

+0

더 최근하고 최신 핵심 데이터 래퍼입니다

[entityElement.managedObjectContext MR_saveToPersistentStoreAndWait]'작동합니다. 나는 아직도 이해하지 못한다. 왜 'saveWithBlock :'이 그렇게 예기치 않게 저장된다. 그리고 왜 내가이 일을해야만하는 것이 엔티티의 컨텍스트를 저장하는 것이라면이 방법이 존재 하는가? –

답변

0

는 CoreData하여 이해하는 몇 가지 중요한 사항이 있습니다

  1. 당신이해야 엔티티가에서 만든 컨텍스트를 사용하여 저장 의 의미를, 기관은 그들이을 사용하고있는 다른 스레드에서 생성 된 경우. 다른 상황과 때로는 여러 스레드 및 초당 저장 횟수가 많은 경우 오류가 발생할 수 있습니다.

  2. "saveWithBlock"메서드는 비동기 저장을위한 것입니다. 즉, 준비가 완료되면 (대개 즉시) 컨텍스트를 저장하므로 변경 사항을 바로 확인하고 데이터를 가져 오면 시도하지 않은 것일 수 있습니다 아직 저장되지 않았습니다.

메인 컨텍스트 - MainQueue와 PrivateQueue 사이의 핵심 데이터의 차이점에 대해 자세히 읽는 데 도움이됩니다.

보통 내가 주어진 방법을 사용하십시오 :

[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait] 

그리고

[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreAndWait] 

는 또한 MR_saveToPersistentStoreWithCompletion을 사용할 수 있습니다 : 비동기 절약을 위해.

이렇게하면 특정 항목을 선택하지 않고도 전체 컨텍스트를 저장할 수 있습니다.

당신이 새로운 경우, 당신은 또한 확인할 수 있습니다 CoreDataStack 난 그냥 엔티티`의 컨텍스트를 저장하려고했습니다

관련 문제