【问题标题】:KVO on the iPhone on 3.0 vs 2.2.1, having an issueiPhone 上的 KVO 3.0 vs 2.2.1,有问题
【发布时间】:2009-06-23 22:06:08
【问题描述】:

似乎 3.0 NDA 已被取消,所以这个问题应该是安全的。如果这违反了 NDA,请告诉我,以便我可以删除帖子,尽快。

我在 NSOperationQueue 上有一个非常简单的 KVO 实现。我的问题是,在针对 2.2.1 SDK 进行编译时,对于使用 3.0 的设备或使用 2.2.1 的设备,我得到了不同的 NSOperationQueue 结果。我已经在 1 部 2.2.1 的 iPod Touch、1 部 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 上它不是 nil。

【问题讨论】:

  • 尝试使用 NSLog() 来检查对象的值,而不是 GDB。我在使用 Xcode 3.1.3 构建 2.2.1 时遇到了一个奇怪的问题:openradar.me/7017295

标签: iphone objective-c key-value-observing


【解决方案1】:

你得到的值听起来像object 参数实际上是nil。要找到问题的根源,您可能希望检查 objectself.myOperationQueue 是否具有相同的值——如果它们是相同的值,那么您的 self.myOperationQueue 只是处于一种奇怪的状态。如果它们不相等,那么您可以从self.myOperationQueue 读取而不是object

但是,您正在使用NSKeyValueObservingOptionNew 选项,但您没有读取它为您提供的值。 NSKeyValueObservingOptionNew 的重点在于它传递了change字典中的新值。

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

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

【讨论】:

  • 嘿,马特,当您猜到该对象为零时,您肯定是对的。我很困惑为什么对象在 2.2.1 设备上运行但不是在 3.0 设备上运行时为零..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多