一对多的KVO,但传递到observeValueForKeyPath的NSNull对象
我有一个托pipe对象与成员类的一对多关系。 当我添加成员的观察员,它的工作。 当一个新成员添加到关系中时,将使用新对象调用observeValueForKeyPath,并且更改字典包含新成员对象。 但是,obserValueForKeyPath将被第二次触发,所有值为nil并且改变字典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(@“%@”,更改)设置断点; 这是堆栈跟踪,但对谁来进行这个调用并没有什么帮助。
main – > UIApplicationMain – > NSKeyValueNotifyObserver – > observeValueForKeyPath:ofObject:change:context
编辑2也许这仍然是一个错误? 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
。 称之为务实的解决scheme。