「iPhone3のその他の開発」の同時実行の章で例を試していましたが、KVONSOperationQueue
を期待どおりに動作させることができません。を作成し、以下を使用してその配列をNSOperationQueue
観察します。operations
NSOperationQueue *newQueue = [[NSOperationQueue alloc] init];
self.queue = newQueue;
[newQueue release];
[queue addObserver:self
forKeyPath:@"operations"
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
context:NULL];
最初NSOperation
のものがキューに追加されると、その基になるoperations
配列(iOSのドキュメントではKVOに準拠していると記載されています)に追加されると思います。したがって、変更ディクショナリで、からのマッピングと、NSKeyValueChangeKindKey
からのマッピングを検索します。追加されたに。しかし、私はどんな種類の価値も見ていませんでした。NSKeyValueChangeInsertion
NSKeyValueChangeNewKey
NSOperation
NSKeyValueChangeInsertion
デバッガーがプロであり、すべてであることは知っていますが、ここにコピーするのに役立つものを用意するために、オブザーバーメソッドを次のように開始しました。
- (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);
そしてそれは印刷します:
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
私のサブクラスであり、単にプロジェクト名です。)ただし、メソッドは1つの操作を挿入すると2回呼び出され、両方とも種類の値が1であることに注意してください。さらに、追加されたアイテムではなく、配列自体のようです。NSOperation
main
Stalled
NSKeyValueChangeSetting
NSKeyValueChangeInsertion
newValue
oldValue
何か案は?ありがとう!