Fixed NSKeyValueMutableArray/Set to post KVO notifications only if

+automaticallyNotifiesObserversForKey: returns YES, and match Cocoa behavior.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@37622 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
qmathe 2014-01-20 17:18:57 +00:00
parent a22fd9fc20
commit f1b7c46f50
3 changed files with 260 additions and 141 deletions

View file

@ -35,6 +35,7 @@
NSString *key;
NSMutableArray *array;
BOOL otherChangeInProgress;
BOOL notifiesObservers;
}
+ (NSKeyValueMutableArray *) arrayForKey: (NSString *)aKey ofObject: (id)anObject;
@ -126,6 +127,8 @@
object = anObject;
key = [aKey copy];
otherChangeInProgress = NO;
notifiesObservers =
[[anObject class] automaticallyNotifiesObserversForKey: aKey];
}
return self;
}
@ -224,7 +227,7 @@
{
NSIndexSet *indexes = nil;
if (!otherChangeInProgress)
if (notifiesObservers && !otherChangeInProgress)
{
indexes = [NSIndexSet indexSetWithIndex: index];
[object willChange: NSKeyValueChangeRemoval
@ -233,7 +236,7 @@
}
[removeObjectInvocation setArgument: &index atIndex: 2];
[removeObjectInvocation invoke];
if (!otherChangeInProgress)
if (notifiesObservers && !otherChangeInProgress)
{
[object didChange: NSKeyValueChangeRemoval
valuesAtIndexes: indexes
@ -245,7 +248,7 @@
{
NSIndexSet *indexes = nil;
if (!otherChangeInProgress)
if (notifiesObservers && !otherChangeInProgress)
{
indexes = [NSIndexSet indexSetWithIndex: index];
[object willChange: NSKeyValueChangeInsertion
@ -255,7 +258,7 @@
[insertObjectInvocation setArgument: &anObject atIndex: 2];
[insertObjectInvocation setArgument: &index atIndex: 3];
[insertObjectInvocation invoke];
if (!otherChangeInProgress)
if (notifiesObservers && !otherChangeInProgress)
{
[object didChange: NSKeyValueChangeInsertion
valuesAtIndexes: indexes
@ -266,9 +269,8 @@
- (void) replaceObjectAtIndex: (NSUInteger)index withObject: (id)anObject
{
NSIndexSet *indexes = nil;
BOOL triggerNotifications = !otherChangeInProgress;
if (triggerNotifications)
if (notifiesObservers && !otherChangeInProgress)
{
otherChangeInProgress = YES;
indexes = [NSIndexSet indexSetWithIndex: index];
@ -287,7 +289,7 @@
[self removeObjectAtIndex: index];
[self insertObject: anObject atIndex: index];
}
if (triggerNotifications)
if (notifiesObservers && !otherChangeInProgress)
{
[object didChange: NSKeyValueChangeReplacement
valuesAtIndexes: indexes
@ -336,7 +338,7 @@
NSIndexSet *indexes = nil;
NSMutableArray *temp;
if (!otherChangeInProgress)
if (notifiesObservers && !otherChangeInProgress)
{
indexes = [NSIndexSet indexSetWithIndex: index];
[object willChange: NSKeyValueChangeRemoval
@ -350,7 +352,7 @@
[setArrayInvocation setArgument: &temp atIndex: 2];
[setArrayInvocation invoke];
if (!otherChangeInProgress)
if (notifiesObservers && !otherChangeInProgress)
{
[object didChange: NSKeyValueChangeRemoval
valuesAtIndexes: indexes
@ -363,7 +365,7 @@
NSIndexSet *indexes = nil;
NSMutableArray *temp;
if (!otherChangeInProgress)
if (notifiesObservers && !otherChangeInProgress)
{
indexes = [NSIndexSet indexSetWithIndex: index];
[object willChange: NSKeyValueChangeInsertion
@ -377,7 +379,7 @@
[setArrayInvocation setArgument: &temp atIndex: 2];
[setArrayInvocation invoke];
if (!otherChangeInProgress)
if (notifiesObservers && !otherChangeInProgress)
{
[object didChange: NSKeyValueChangeInsertion
valuesAtIndexes: indexes
@ -390,7 +392,7 @@
NSIndexSet *indexes = nil;
NSMutableArray *temp;
if (!otherChangeInProgress)
if (notifiesObservers && !otherChangeInProgress)
{
indexes = [NSIndexSet indexSetWithIndex: index];
[object willChange: NSKeyValueChangeReplacement
@ -405,7 +407,7 @@
[setArrayInvocation setArgument: &temp atIndex: 2];
[setArrayInvocation invoke];
if (!otherChangeInProgress)
if (notifiesObservers && !otherChangeInProgress)
{
[object didChange: NSKeyValueChangeReplacement
valuesAtIndexes: indexes
@ -458,67 +460,102 @@
- (void) addObject: (id)anObject
{
NSIndexSet *indexes = [NSIndexSet indexSetWithIndex: [array count]];
NSIndexSet *indexes = nil;
[object willChange: NSKeyValueChangeInsertion
valuesAtIndexes: indexes
forKey: key];
if (notifiesObservers)
{
indexes = [NSIndexSet indexSetWithIndex: [array count]];
[object willChange: NSKeyValueChangeInsertion
valuesAtIndexes: indexes
forKey: key];
}
[array addObject: anObject];
[object didChange: NSKeyValueChangeInsertion
valuesAtIndexes: indexes
forKey: key];
if (notifiesObservers)
{
[object didChange: NSKeyValueChangeInsertion
valuesAtIndexes: indexes
forKey: key];
}
}
- (void) removeObjectAtIndex: (NSUInteger)index
{
NSIndexSet *indexes = [NSIndexSet indexSetWithIndex: index];
NSIndexSet *indexes = nil;
[object willChange: NSKeyValueChangeRemoval
valuesAtIndexes: indexes
forKey: key];
if (notifiesObservers)
{
indexes = [NSIndexSet indexSetWithIndex: index];
[object willChange: NSKeyValueChangeRemoval
valuesAtIndexes: indexes
forKey: key];
}
[array removeObjectAtIndex: index];
[object didChange: NSKeyValueChangeRemoval
valuesAtIndexes: indexes
forKey: key];
if (notifiesObservers)
{
[object didChange: NSKeyValueChangeRemoval
valuesAtIndexes: indexes
forKey: key];
}
}
- (void) insertObject: (id)anObject atIndex: (NSUInteger)index
{
NSIndexSet *indexes = [NSIndexSet indexSetWithIndex: index];
NSIndexSet *indexes = nil;
[object willChange: NSKeyValueChangeInsertion
valuesAtIndexes: indexes
forKey: key];
if (notifiesObservers)
{
indexes = [NSIndexSet indexSetWithIndex: index];
[object willChange: NSKeyValueChangeInsertion
valuesAtIndexes: indexes
forKey: key];
}
[array insertObject: anObject atIndex: index];
[object didChange: NSKeyValueChangeInsertion
valuesAtIndexes: indexes
forKey: key];
if (notifiesObservers)
{
[object didChange: NSKeyValueChangeInsertion
valuesAtIndexes: indexes
forKey: key];
}
}
- (void) removeLastObject
{
NSIndexSet *indexes = [NSIndexSet indexSetWithIndex: [array count] - 1];
NSIndexSet *indexes = nil;
[object willChange: NSKeyValueChangeRemoval
valuesAtIndexes: indexes
forKey: key];
if (notifiesObservers)
{
indexes = [NSIndexSet indexSetWithIndex: [array count] - 1];
[object willChange: NSKeyValueChangeRemoval
valuesAtIndexes: indexes
forKey: key];
}
[array removeObjectAtIndex: [indexes firstIndex]];
[object didChange: NSKeyValueChangeRemoval
valuesAtIndexes: indexes
forKey: key];
if (notifiesObservers)
{
[object didChange: NSKeyValueChangeRemoval
valuesAtIndexes: indexes
forKey: key];
}
}
- (void) replaceObjectAtIndex: (NSUInteger)index withObject: (id)anObject
{
NSIndexSet *indexes = [NSIndexSet indexSetWithIndex: index];
NSIndexSet *indexes = nil;
[object willChange: NSKeyValueChangeReplacement
valuesAtIndexes: indexes
forKey: key];
if (notifiesObservers)
{
indexes = [NSIndexSet indexSetWithIndex: index];
[object willChange: NSKeyValueChangeReplacement
valuesAtIndexes: indexes
forKey: key];
}
[array replaceObjectAtIndex: index withObject: anObject];
[object didChange: NSKeyValueChangeReplacement
valuesAtIndexes: indexes
forKey: key];
if (notifiesObservers)
{
[object didChange: NSKeyValueChangeReplacement
valuesAtIndexes: indexes
forKey: key];
}
}