我正在通過「更多iPhone 3開發」的併發章節中的示例進行工作,並且無法按預期方式在NSOperationQueue
上運行KVO。我創建NSOperationQueue
並使用觀察其operations
陣列:使用KO與NSOperationQueue更改字典值錯誤?
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
僅僅是我的NSOperation
的子類,它恰當地覆蓋main
,而Stalled
就是項目名稱。)但請注意,在插入單個操作時調用該方法兩次,並且兩次都使用一種值爲1,即NSKeyValueChangeSetting
,而不是NSKeyValueChangeInsertion
。此外,newValue
和oldValue
似乎是陣列本身,而不是添加的項目。
任何想法?謝謝!
插入通知將永遠不會被髮送,因爲該屬性具有NSArray類型(檢查文檔),因此無法插入。 – JeremyP 2011-01-04 09:01:21