mirror of
https://github.com/gnustep/libs-base.git
synced 2025-06-03 10:00:51 +00:00
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:
parent
a22fd9fc20
commit
f1b7c46f50
3 changed files with 260 additions and 141 deletions
|
@ -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];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue