Ich arbeitete durch ein Beispiel im Nebenläufigkeitskapitel von "Mehr iPhone 3 Entwicklung" und kann KVO auf NSOperationQueue
nicht wie erwartet funktionieren. Ich erstelle eine NSOperationQueue
und beobachten seine operations
Array:Ändern Sie die Wörterbuchwerte falsch, wenn Sie KVO mit NSOperationQueue verwenden?
NSOperationQueue *newQueue = [[NSOperationQueue alloc] init];
self.queue = newQueue;
[newQueue release];
[queue addObserver:self
forKeyPath:@"operations"
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
context:NULL];
Wenn die erste NSOperation
der Warteschlange hinzugefügt wird, erwarte ich ihn auf sein operations
Array hinzugefügt werden (die die iOS-Dokumentation sagt, ist KVO-konform) und daher in dem Änderungswörterbuch eine Zuordnung von NSKeyValueChangeKindKey
zu NSKeyValueChangeInsertion
zusammen mit einer Zuordnung von NSKeyValueChangeNewKey
zu der hinzugefügten NSOperation
zu finden. Aber ich sah keinen Wert .
weiß, dass ich die Debugger ist Pro und alle, aber im Interesse der hier zu kopieren, etwas Nützliches zu haben, begann ich meine Beobachter Methode mit:
- (void) observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
NSNumber *kind = [change objectForKey:NSKeyValueChangeKindKey];
NSObject *newValue = [change objectForKey:NSKeyValueChangeNewKey];
NSObject *oldValue = [change objectForKey:NSKeyValueChangeOldKey];
NSIndexSet *indexes = [change objectForKey:NSKeyValueChangeIndexesKey];
NSLog(@"kind=%d, newValue=%@, oldValue=%@, indexes=%@",
[kind integerValue], newValue, oldValue, indexes);
Und den Druck:
2010-11-18 20:01:56.249 Stalled[2692:6f07] kind=1, newValue=(
"<SquareRootOperation: 0x5f51b40>"
), oldValue=(
), indexes=(null)
2010-11-18 20:01:56.250 Stalled[2692:6f07] kind=1, newValue=(
"<SquareRootOperation: 0x5f51b40>"
), oldValue=(
"<SquareRootOperation: 0x5f51b40>"
), indexes=(null)
(SquareRootOperation
ist einfach meine Unterklasse von NSOperation
, die main
entsprechend übersteuert, und Stalled
ist einfach der Projektname.) Beachten Sie jedoch, dass die Methode zweimal beim Einfügen einer einzelnen Operation und beide Male mit einer Art aufgerufen wird Wert von 1, der NSKeyValueChangeSetting
ist, nicht NSKeyValueChangeInsertion
. Außerdem scheinen newValue
und oldValue
das Array selbst zu sein, nicht das hinzugefügte Element.
Irgendwelche Ideen? Vielen Dank!
Die Einfügebenachrichtigung wird niemals gesendet, da die Eigenschaft den Typ NSArray aufweist (siehe Dokumentation) und daher nicht eingefügt werden kann. – JeremyP