3.0 NDA 似乎已取消,因此应该可以放心询问。如果这违反了保密协议(protocol),请告诉我,以便我可以尽快删除该帖子。
我在 NSOperationQueue 上有一个非常简单的 KVO 实现。我的问题是,当针对 2.2.1 SDK 进行编译时,对于使用 3.0 的设备或使用 2.2.1 的设备,我会得到相关 NSOperationQueue 的不同结果。我已经在一台具有 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的设备将返回正确的操作计数和正确的操作。运行 2.2.1 的设备对于操作始终返回 nil,对于操作计数始终返回 0。
似乎无法确定为什么会出现这种情况。所有版本均针对 2.2.1 进行编译。
注意
根据下面马特的回应; 'object' 在 2.2.1 上为零。在 3.0 上它不是 nil。
最佳答案
您获得的值听起来就像 object
参数实际上是 nil
。要找到问题的根源,您可能希望检查 object
和 self.myOperationQueue
是否是相同的值 - 如果它们是您的 self.myOperationQueue
只是处于一种奇怪的状态。如果它们不相等,那么您可以直接从 self.myOperationQueue
读取,而不是从 object
读取。
但是,您正在使用 NSKeyValueObservingOptionNew
选项,但您没有读取它为您提供的值。 NSKeyValueObservingOptionNew
的要点是它传递更改字典中的新值。
即
// Inside the observe method
NSArray *newOperationsArray = [change objectForKey:NSKeyValueChangeNewKey];
如果您不想从更改字典中提取新值,则无需传递 NSKeyValueObservingOptionNew
值(只需传递 0)。
关于iphone - iPhone 3.0 与 2.2.1 上的 KVO 存在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1035504/