改变词典的价值观错误的当使用韩国国际志愿者组织与NSOperationQueue?
-
26-09-2019 - |
题
我工作过的一个例子并发章"更多的iPhone3的发展,"和不能获得韩国国际志愿者组织在一个 NSOperationQueue
工作的预期。我创建一个 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文件说的是韩国国际志愿者组织兼容的),因此,在改变的词典中,找到一映射 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
似乎是阵本身不是项目增加。
任何想法?谢谢!
解决方案
在文档说-operations
是国际志愿者组织兼容的,但是没有指定哪些细节通知会。在实践中,似乎你只告诉已经发生了变化,所以会有比较新旧值找出插入。
不要忘记,这些通知可以发送到你在任何线程!
其他提示
操作性NSOperationQueue没有一个可变的类型(其返回 NSArray*
).因此,它不执行的编入索引到许多合规方法的可变阵列所以你永远不会看到插入的事件,只有改变事件对整个阵列。
编辑
Shadowmatter带来了的事实,实际上返回的对象是一个 NSMutableArray
.这并不改变任何东西。首先, 苹果的文件 是清楚的问题。如果一个方法是返回的一个不可改变的对象,就必须尊重API。你不能使用 isKindOf:
找出它是否真的可变,你必须绝对不改变它。
API说的操作返回的类型是不可改变,因此,必须把它当作这样的。更重要的是对这个问题,因为它不是一个可变的集合财产,它不是 关键的价值兼容的编码 对于可变阵KVC值。对于可变的索引,收集的遵守,该类已
- 实现一个或两者的方法
-insertObject:in<Key>AtIndex:
或-insert<Key>:atIndexes:
.- 实现一个或两者的方法
-removeObjectFrom<Key>AtIndex:
或-remove<Key>AtIndexes:
.
(采取直接从苹果KVC指南)
设计师 NSOperationQueue
类设计的 operations
财产作为不可改变,因此故意忽略的上述方法。