3

MagicalRecord 및 CoreData에 대한 모든 것을 이해하기가 매우 어렵습니다. 따라서, 두 가지 코드가 동일한 작업을 수행합니다. 여기서 tallyM은 MR_defaultContext에서 실행되는 관리 객체입니다.MagicalRecord saveWithBlock 대 saveToPersistentStoreAndWait

옵션 1 :

Tally *tallyM      = (Tally *)[Tally MR_findFirstWithPredicate:predicateM]; 

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { 

    Tally *tallyMLocal    = [tallyM MR_inContext:localContext]; 
    tallyMLocal.tl_countMale  = [NSString stringWithFormat:@"%ld", (long)uiTallyMaleCounter]; 

} completion:^(BOOL success, NSError *error) { 

     [self updateTallies_APICall:[tallyM MR_inContext:[NSManagedObjectContext MR_defaultContext]]]; 
}]; 

옵션 2 :

Tally *tallyM      = (Tally *)[Tally MR_findFirstWithPredicate:predicateM]; 
tallyM.tl_countMale     = [NSString stringWithFormat:@"%ld", (long)uiTallyMaleCounter]; 
[tallyM.managedObjectContext MR_saveToPersistentStoreAndWait]; 
[self updateTallies_APICall:[tallyM MR_inContext:[NSManagedObjectContext MR_defaultContext]]]; 

질문 :

  1. 어느 쪽이 더 나은 무엇입니까? 비동기 저장이 필요할 때 saveWithBlock을 사용할 수 있지만 다른 차이점이 있습니까? 옵션 1보다 안전하고 우수합니다. 옵션 2?

  2. 옵션 1에는 MR_defaultContext에서 실행되는 tallyM이 있습니다. 그런 다음 saveWithBlock 내부에서 tallyML을 변경하고 컨텍스트를 저장하여 tallyM을 변경합니다. saveWithBlock을 실행 한 후 완료 핸들러 (tallyM을 계속 사용해야 할 때), tallyM (여전히 MR_defaultContext에서 실행 중)이 tl_countMale을 업데이트 할 것을 확신 할 수 있습니까?

  3. 옵션 1, 완료 핸들러에서 아래 코드를 호출해야합니까? saveWithBlock이 실행 된 후 tallyM이 MR_defaultContext에서 계속 실행된다고 가정합니다 (이미 콘솔로 확인했지만 확실하게하고 싶습니다). MR_inContext를 다시 호출해야합니까?

    [tallyM MR_inContext은 : [NSManagedObjectContext MR_defaultContext]

  4. 이의 내가 모든 저장 비동기 필요가 없습니다 가정 해 봅시다. 따라서 옵션 2 또는 saveWithBlockAndWait을 사용할 수 있습니다. saveWithBlockAndWait은 어떤 식 으로든 보다 좋습니다. 옵션 2?

마침내 MagicalRecords와 CoreData가 어떻게 작동하는지 정확하게 이해하고 싶습니다.

답변

3

개인적으로 나는 옵션 2의 패턴을 피할 것입니다. 하나의 관리 객체 컨텍스트를 관리 객체 컬렉션에서의 작업 범위로 사용해야한다는 아이디어가 있습니다.

NSManagedObjectContext *localContext = //...; 
NSManagedObject *localObject = [otherObject MR_inContext:localContext]; 
///make changes to localObject 
[localContext MR_saveToPersistentStoreAndWait]; 

는 [MagicalRecord saveWithBlock이 :] 방법은 기본적으로 더 편리한 API에서이 패턴을 구현하는 대부분의 예는 다음과 같은 패턴을 사용하는 이유입니다.

또한 defaultContext를 암시 적으로 사용하지 않는 것이 좋습니다. 앱에서 스레드를 다루기 시작했을 때 코드를 바꿔야 할 수도 있기 때문에 코드에 더 명심하십시오.

완료 핸들러는 저장 조작이 100 % 완료된 후에 항상 호출되는 방식으로 작성됩니다. 나 자신을 위해 소스 코드를 읽는 것이 좋습니다.