我工作过的一个例子并发章"更多的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文件说的是韩国国际志愿者组织兼容的),因此,在改变的词典中,找到一映射 NSKeyValueChangeKindKeyNSKeyValueChangeInsertion, 沿映射 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.此外, newValueoldValue 似乎是阵本身不是项目增加。

任何想法?谢谢!

有帮助吗?

解决方案

在文档说-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 财产作为不可改变,因此故意忽略的上述方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top