2014-05-23 3 views
2

내 핵심 데이터 모델에서 "주소"엔티티에 바인딩 된 NSArrayController가 있습니다. 이 Address 엔티티에 삽입 할 새 객체를 모니터링하거나 삭제할 기존 객체를 모니터링하려고합니다. KVO를 통해이 작업을 수행하려고 시도하고 있지만이 작업에 대해 어떻게해야하는지 잘 모르겠습니다.NSArrayController 변경 관찰 : 삽입 또는 삭제 감지

[self.addressArrayController addObserver:self 
            forKeyPath:@"arrangedObjects" 
             options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld 
             context:@"Address"]; 

나는이에 관찰자 알림을받을 수 있나요 : 내로 awakeFromNib에서

, 나는 "arrangedObjects"에 대한 관찰자로 뷰 컨트롤러 클래스를 추가

- (void)observeValueForKeyPath:(NSString *)keyPath 
        ofObject:(id)object 
        change:(NSDictionary *)change 
        context:(void *)context { 

    if(object == self.addressArrayController) { 
     // what do do here? 
    } 
} 

문제가 있다는 것입니다 변경 사전은 (아무리 오래된 Apple 버그로 인해서) 항상 nil입니다. 그래서 어떤 오브젝트가 추가되거나 삭제되었는지, 심지어 어떤 것이 추가되거나 삭제되었는지 전혀 알지 못합니다! 추가되거나 삭제 된 정확한 객체가 필요합니다.이 엔티티에 대한 모든 객체를 트래버스하고 객체의 타임 스탬프 또는 다른 기준에 따라 계산하지 않아도됩니다.

가장 좋은 방법은 무엇입니까?

+2

이 경우에는, 당신은'new'와'old'리스트는'NSNull 것을 의미 '맞지? 나는 이것이 버그인지 여부는 아니지만 오랫동안 (적어도 10.4 이상) 문서화되지 않은 행동입니다. 그러나 사전이 비어 있지 않더라도'newObject'와'old'가'NSKeyValueChangeSetting'이 아닌'arrangedObjects'에 대한 알림을 본 적이 없으므로이 목적을 위해 사전이 쓸모 없게됩니다. 어쨌든 전체 차등을 수행해야합니다. 핵심 데이터를 사용하고 있으므로'NSManagedObjectContextObjectsDidChangeNotification'을 시도해 보셨습니까? – gaige

+0

감사합니다. 이 경우 컨텍스트 알림을 사용하는 것이 좋습니다. –

답변

3

my answer here에서 수정 한 내용은 설명에 gaige가 제안한 코드를 나타냅니다. NSManagedObjectContextObjectsDidChangeNotification에 대한

등록 :

[[NSNotificationCenter defaultCenter] addObserver: self 
             selector: @selector(mocDidChangeNotification:) 
           name:NSManagedObjectContextObjectsDidChangeNotification 
              object: nil]; 

그리고 대응 방법에서 사용자 정보 사전 분석 :

- (void)mocDidChangeNotification:(NSNotification *)notification 
{ 
    NSManagedObjectContext* savedContext = [notification object]; 

    // Ignore change notifications for anything but the mainQueue MOC 
    if (savedContext != self.managedObjectContext) { 
     return; 
    } 

    // Ignore updates -- lots of noise from maintaining user-irrelevant data 

    // Log insertion 
    for (NSManagedObject* insertedObject in 
      [notification.userInfo valueForKeyPath:NSInsertedObjectsKey]) 
    { 
     if ([insertedObject isKindOfClass:[Address class]]) 
     { 
      NSLog(@"Inserted Address"); 
     } 
    } 

    // Log deletion 
    for (NSManagedObject* deletedObject in 
      [notification.userInfo valueForKeyPath:NSDeletedObjectsKey]) 
    { 
     if ([deletedObject isKindOfClass:[Address class]]) 
     { 
      NSLog(@"Deleted Address"); 
     } 
    } 

} 
+0

모델이 CoreData에 저장되지 않으면 어떻게됩니까? – Etan