iphone - iPhone 3.0 与 2.2.1 上的 KVO 存在问题

标签 iphone objective-c key-value-observing

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。要找到问题的根源,您可能希望检查 objectself.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/

相关文章:

iphone - 动画调整 UITableView 的 UIView 标题

iphone - 如何处理iPhone内存不足的警告?

iphone - UITableView 中 Plist 中的数据排序不正确

objective-c - 监听 iOS 应用中的所有触摸事件

ios - 解析保存唯一对象错误

macos - NSDocument 向 NSViewController 发送事件的标准方法是什么?

iphone - 应用程序中分配了很多内存,如何解决?

iphone - NSFetchRequest/谓词问题

ios - 替代覆盖 didChangeValueForKey : on NSManagedObject

iOS MapKit 拖动注释(MKAnnotationView)不再随 map 平移