2

似乎 3.0 NDA 已被取消,所以这个问题应该是安全的。如果这违反了 NDA,请让我知道,以便我可以删除帖子,匆忙后。

我在 NSOperationQueue 上有一个非常简单的 KVO 实现。我的问题是,在针对 2.2.1 SDK 进行编译时,对于使用 3.0 的设备或使用 2.2.1 的设备,我得到了不同的 NSOperationQueue 结果。我已经在 1 个 2.2.1 的 iPod Touch、一个 3.0 的 iPod Touch 和两组具有类似设置的 iPhone 上确认了这一点。

代码如下所示:

// set observer
[self.myOperationQueue addObserver:self forKeyPath:@"operations" options:NSKeyValueObservingOptionNew context:NULL];

// implementation
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{
    if ([keyPath isEqualToString:@"operations"]) {
      NSInteger operationCount = [[(NSOperationQueue*)object operations] count];
      NSArray *operations = [(NSOperationQueue*)object operations];
    }
}

根据上面的代码,运行 3.0 的设备将返回正确的 operationCount 和正确的操作。运行 2.2.1 的设备对于操作将始终返回 nil,对于 operationCount 将始终返回 0。

似乎无法确定为什么会这样。所有构建都是针对 2.2.1 编译的。

笔记

根据下面马特的回应;'object' 在 2.2.1 上为零。在 3.0 上它不是零。

4

1 回答 1

1

你得到的值听起来像object参数是字面意思nil。要找到问题的根源,您可能希望检查它object并且self.myOperationQueue是相同的值 - 如果它们是那么你self.myOperationQueue只是处于奇怪的状态。如果它们不相等,那么您可以只读取self.myOperationQueue而不是object.

但是,您正在使用该NSKeyValueObservingOptionNew选项,但您没有阅读它给您的价值。关键NSKeyValueObservingOptionNew是它传递了更改字典中的新值。

IE

// Inside the observe method
NSArray *newOperationsArray = [change objectForKey:NSKeyValueChangeNewKey];

如果您不想从更改字典中提取新值,则不需要传递该NSKeyValueObservingOptionNew值(可以只传递 0)。

于 2009-06-23T23:40:43.067 回答