一对多但NSNull对象的KVO传递到observeValueForKeyPath



我有一个与成员类具有一对多关系的托管对象。当我加上各位成员的观察员时,它起了作用。当一个新成员添加到关系中时,observeValueForKeyPath将与新对象一起调用,并且change dictionary包含新成员对象。然而,observeValueForKeyPath将被第二次触发,所有值为nil,并将dictionary new更改为"NULL"。第二个触发器是什么?我设置了一个断点,但不确定是谁触发的。

@interface FooObject : NSManagedObject {}
@property (nonatomic, strong) NSString *fooId;
@property (nonatomic, strong) NSSet* members;
@end
@implementation FooObject
@dynamic fooId;
@dynamic members;
- (NSMutableSet*)membersSet {
    [self willAccessValueForKey:@"members"];
    NSMutableSet *result = (NSMutableSet*)[self mutableSetValueForKey:@"members"];
    [self didAccessValueForKey:@"members"];
    return result;
}
- (void)registerObservers {
    [self addObserver:self
           forKeyPath:@"members"
              options:NSKeyValueObservingOptionNew
              context:nil];
}
- (void)unregisterObservers {
    @try{
        [self removeObserver:self forKeyPath:@"members"];
    }@catch(id anException){
        //do nothing, obviously it wasn't attached because an exception was thrown
    }
}
- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object 
                        change:(NSDictionary *)change 
                       context:(void *)context
    id valueNewSet = [change objectForKey:NSKeyValueChangeNewKey];
    if (![valueNewSet isKindOfClass:[NSSet class]]) {
            // not a NSSet, it contains <null> value
            NSLog(@"%@", change);
            NSLog(@"%@", object);
    }
    if ([[change objectForKey:NSKeyValueChangeKindKey] intValue] == NSKeyValueChangeInsertion) {
           // insert change is valid, process the changes
    }
}
@end

日志输出:

{
    kind = 1;
    new = "<null>";
}
<FooObject: 0xfa9cc60> (entity: FooObject; id: 0xfa9be00 <x-coredata://39DB31FD-6795-4FDE-B700-819AB22E5170/SHInterest/p6> ; data: {
    fooId = nil;
    members = nil;
})

编辑1我在NSLog上设置了一个断点(@"%@",change);这是堆栈跟踪,但对确定是谁进行了此调用没有实际帮助。

main->UIApplicationMain->NSKeyValueNotifyObserver->observeValueForKeyPath:ofObject:change:上下文

编辑2也许这仍然是一个bug?http://www.cocoabuilder.com/archive/cocoa/182567-kvo-observevalueforkeypath-not-reflecting-changes.html

我遇到了同样的问题,"隐式"分配(以及KVO观察员的通知)显然只是作为解除分配MO的一部分发生的:我保存一个子MOC,然后释放它,然后iOS释放它的MO。我假设它在解除分配相关MO的过程中(其中应用了删除规则级联)将一对多关系临时设置为NSNull

因此,在更改插入和删除的种类之后,我的KVO观察器现在也接受NSKeyValueChangeSetting并断言change[NSKeyValueChangeNewKey] == NSNull.null。称之为务实的解决方案。

相关内容

  • 没有找到相关文章

最新更新