0

(내가 앱을 실행하자마자) 백그라운드 스레드에서 데이터베이스에 필수적이지 않은 변경을 한 다음 주 컨텍스트로 병합합니다. 백그라운드 스레드는 많은 변경을 초래할 수 있지만이 백그라운드 처리에서 컨텍스트가 일부 유효성 검증 오류 또는 일부 핵심 데이터 예외를 넘기지 않도록하고 싶습니다. 특히 핵심 데이터와 함께 iCloud를 사용하기 때문에 사용자는 미묘한 관계로 끝날 수 있습니다. 난 그저 예외를 던지기를 멈추지 않고 앱을 계속 실행하기를 원한다.NSManagedObjectContext 주위에 try-catch를 저장하면 도움이됩니까?

이 경우 컨텍스트 저장과 관련하여 @ try- @ catch 블록을 사용하는 것이 합리적입니까? 이 작업을 수행 할 때 성능 또는 메모리 관리 문제가 있습니까?

이런 식으로 뭔가 : 고객의 수천

@try { 
     [context performBlockAndWait: ^{ 
      NSError *error = nil; 
      if ([context save:&error]){ 
       NSLog(@"Child context saved"); 

       [context.parentContext performBlockAndWait:^{ 
        NSError *parentError = nil; 
        if ([context.parentContext save: &parentError]){ 
         NSLog(@"Parent context saved"); 
        } 
       }]; 
      } 
     }]; 
    } .... 

내 애플 선박, 그래서 아는 것이 좋을 것 전에 손이 해결보다는이 더 많은 문제를 일으킬 수 있다면.

+2

실제로 예외를 안전한 방법으로 복구 할 수있는 경우가 아니면 catch하는 것이 많은 의미가 없습니다. –

답변

2

어떤 예외가 발생하고 있습니까?

-[NSManagedObjectContext save:]NSError 출력 매개 변수 패턴을 사용하기 때문에 일반적으로 출력하지 않을 것으로 예상합니다. 그러나 코코아의 일반적인 패턴은 예외가 "죽음"이며 복구 가능한 것으로 간주되지 않는다는 것입니다.

예외를 throw하고 catch하는 장소가 있습니다 (디버거에서 예외 발생 중단 점을 설정하여 볼 수 있음) - 을보고 있습니다. 코코아 바인딩 - 일반적으로 if 예외는 앱의 코드에 버블이 생기고 이미 "죽은 상태"입니다.

이렇게하는 데 성능 또는 메모리 관리 문제가 있습니까?

요즘 @try/@catch/@finally의 성능 패널티는 거의 없습니다 (항상 그런 것은 아닙니다). 메모리 관리에 대한 의미가 있습니다 (아마이 플랫폼에서 예외가 일반적으로 "죽음"인 이유입니다). 예외가 발생하여 ARC를 사용하고 범위를 벗어나는 경우 ARC가 수행 한 유지는 이 아니라입니다. 풀어 놓았다. here 바와 같이

표준 코코아 규칙의 예외는 프로그래머 오류 신호로부터 회수되는 것은 아니라는 것이다. 코드 을 기본적으로 예외로 설정하면 심각한 런타임 및 코드 크기 인 은 예외적으로 안전을 제외하고 일반적으로 실제로는 신경 쓰지 않는 코드에 페널티가 부과됩니다. 따라서 ARC 생성 코드는 기본적으로 예외에서 누출됩니다.이 경우 프로세스가 으로 즉시 종료됩니다. 예외에서 을 복구하는 데 관심이있는 프로그램은이 옵션을 활성화해야합니다.

요약하면 @try/@catch 블록에 컨텍스트 저장 작업을 래핑 할 필요는 없습니다.