2012-10-08 2 views
0

나는 누군가가 전에 이것을 보았을 것입니다. 나는 분명히 뭔가 빠졌을 것입니다 ... 간단한 요약은 다음과 같습니다. 핵심 데이터 애플리케이션을 가지고 있는데, Car 및 CarMileage가 있습니다. 정확하게 자동차 여행으로 생각했습니다 (차량 < - >> CarMileage). CarMileage에는 주행 거리 (주행 거리, 주행 거리), forWork (BOOL) 등 몇 가지 속성이 있습니다. mileageForWork (float, forWork = YES이면 마일리지, forWork = NO이면 0)를 포함하는 커스텀 CarMileage 클래스를 만들었습니다. 또한 + keyPathsForValuesAffectingMileageForWork를 만들어 마일리지 및 forWork 집합을 반환합니다. 이제 해당 연도의 특정 자동차에 대한 총 percentMileageForWork를 계산해야합니다.핵심 데이터 awakeFromFetch의 NSNotification이 충돌을 야기 함

은 현재 내가 CarMileage에 있습니다

- (float) mileageForWork { 
    float mileageForWork; 
    if ([self.forWork boolValue] == YES) { 
     mileageForWork = [self.mileage floatValue]; 
    } else { 
     mileageForWork = 0; 
    } 
    [[NSNotificationCenter defaultCenter] postNotificationName: @"mileageForWorkChanged" object:self]; 
    NSLog(@"send notification"); 
    return mileageForWork; 
} 

는 그런 자동차가 : 자동 저장된 파일을로드 할 때

- (void) awakeFromFetch { 
    [super awakeFromFetch]; 
    [self updatePercentMileageForWork]; 
    [[NSNotificationCenter defaultCenter] addObserver: self 
              selector: @selector(updatePercentMileageForWork) 
               name: @"mileageForWorkChanged" 
               object: nil]; 
    NSLog(@"awakeFromFetch"); 
} 

- (void) awakeFromInsert { 
    [super awakeFromInsert]; 
    [[NSNotificationCenter defaultCenter] addObserver: self 
              selector: @selector(updatePercentMileageForWork) 
               name: @"mileageForWorkChanged" 
               object: nil]; 
    NSLog(@"awakeFromInsert"); 
} 

, 나는 차와 CarMileage에 대한 NSArrayController를 포함하는 차량 섹션으로 이동하십시오. 로그에 "통지 보내기", percentMileageForWork의 값 및 "awakeFromFetch"가 표시되고 프로그램이 일시 중지되고 XCode의 스레드 탭이 szone_malloc_should_clear, EXC_BAD_ACCESS 코드 = 2로 팝업됩니다.

이 일이 일어나고 있습니다. 경험이 적은 나의 눈에는 문제가 알림을 관찰해야하는 곳인 것처럼 보입니다. 결국, 게시물은 로그를 작성합니다. 왜 그것이 충돌하는지 어떤 아이디어?

EDIT (10 월 14 일) - CarMileage의 -awakeFromInsert-awakeFromFetch에서 개체가 자동차를 관찰자로 추가하도록 키 값 관찰 모델로 변경하려고했습니다. 이것은 페치에 대해 예상대로 작동하지만 객체가 삽입되면 내 -updatePercentMileageForWork 메서드는 실행되지 않습니다. 그것은 CarMileage 관계에 Car가 Observer가 추가되었을 때 아직 설정되지 않았기 때문입니다 (그래서 Observer를 전혀 설정하지 않았습니다). 거기에 차를 이동하는 방법이있는 것 같아 그 새로운 CarMileage 개체를 관계 집합에 추가하는 메서드 내에서 Car, 그래서 그 문제가 발생하지 않습니다. 코어 데이터 자체의 코드를 엉망으로 만들어야하는지 잘 모르겠다. 최적화가 잘되어 있고, 코드가 정상적으로 읽히는 방법을 모르기 때문에 내 관계가 완전히 엉망이 될까 걱정된다. . 나는 "mogenerator"에 대해 뭔가를 들었다. 그러나 나는 문서를 찾을 수 없다. 그리고 내가 이미 혼란 스러울 때 나는 잘 이해하지 못하는 다른 프로그램을 사용하여 약간 불편 함을 느낀다 ...

내가 어디에서해야하는지 잘 아는 사람이 있는가? -addObserver:forKeyPath:options:context을 호출하십시오. 그리고 관계가 설정되어있는 곳이면 어떻게할까요? 또는 알림을 사용하여 의도 한 원래 방식대로 어떻게 처리할까요?

답변

0

바보 같고 어리 석다. My -updatePercentMileageForWork 메서드가 carMileage. @ sum.mileageForWork를 호출하여 재 계산 된 새로운 알림을 게시하여 무한 루프를 설정합니다. 실제로 새 값이 아닌마다의 경우

- (float) mileageForWork { 
    float newMileageForWork; 
    if ([self.forWork boolValue] == YES) { 
     newMileageForWork = [self.mileage floatValue]; 
    } else { 
     newMileageForWork = 0; 
    } 

    if (newMileageForWork == mileageForWork) { 
     return mileageForWork; 
    } else { 
     mileageForWork = newMileageForWork; 
     [[NSNotificationCenter defaultCenter] postNotificationName: @"mileageForWorkChanged" object:self]; 
     NSLog(@"send notification"); 
     return mileageForWork; 
    } 

} 

그 방법에만 알림을 보내드립니다 : 그래서이기 위하여 CarMileage -mileageForWork 방법을 변경했습니다. 이는 새로운 CarMileage 객체 (즉, 새로운 여행)가 해당 자동차에 추가 될 때 mileageForWork와 newMileageForWork가 모두 0으로 기본 설정되어 아무 알림도 보내지 않는 문제를 남겼습니다. mileageForWork = 1로 CarMileage에서 -awakeFromInsert를 그냥 지나쳤습니다. 새로운 객체를 삽입하면 알림 루프가 두 번 실행됩니다. 특정 루프가 두 번 실행되는 것은 NSManagedObjectContextObjectsDidChangeNotification을 사용하는 것처럼 개체가 변경 될 때마다 알림을 보내는 것보다 훨씬 효율적입니다.

관련 문제