Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

KVO on an NSCountedSet?

I'd like to monitor an NSCountedSet to see if its contents changes. Setting up KVO seems to compile but it's not being triggered. First question: can you observe a set? If so then is there something wrong with this message?

    [subViewA addObserver:subViewB forKeyPath:@"countedSet" options:0 context:NULL];

I'm really just trying to monitor the count of (number of objects in) the set if that helps.

Edit - here's the observer (subViewB):

- (void)observeValueForKeyPath:(NSString *)keyPath 
                      ofObject:(id)object 
                        change:(NSDictionary *)change 
                       context:(void *)context {
    if ([keyPath isEqual:@"countedSet"]) {
        NSLog(@"Set has changed");
    }
}

Edit2 - moved the addObserver message from the subView to the viewController. So I'm trying to get one subView to observe a NSCountedSet in another of the viewController's subViews. key path is "relative to the receiver" - which I assume to be subViewA.

like image 980
Meltemi Avatar asked Dec 30 '22 13:12

Meltemi


1 Answers

Talking directly to the set object does not issue KVO change notifications. You need to make changes to the property's set value in a KVC-compliant way. There are two ways:

  1. Send the property owner a mutableSetValueForKey: message. This will give you a fake set object that wraps the property and posts KVO notifications around each change you make to it.
  2. Implement the set accessor methods for the property, and use them everywhere. The implementation of each method talks directly to the underlying set object; all code that isn't in one of these methods should go through them. So, for example, to add an object, you should not use [myCountedSet addObject:foo] (except in addCountedSetObject:); you should use [self addCountedSetObject:foo] instead.

I recommend #2. It may sound like more work, but it's not much, and it makes for really good code.

More details in the Model Object Implementation Guide and in the Core Data Programming Guide (even though this is not specific to Core Data).

like image 184
Peter Hosey Avatar answered Feb 07 '23 23:02

Peter Hosey