КВО на iPhone на 3.0 против 2.2.1, возникла проблема - PullRequest
2 голосов
/ 24 июня 2009

Похоже, что 3,0 NDA был отменен, так что это должно быть безопасно спросить. Если это нарушает NDA, пожалуйста, дайте мне знать, чтобы я мог удалить сообщение, поспешное.

У меня есть очень тривиальная реализация для KVO в NSOperationQueue. Моя проблема заключается в том, что при компиляции с использованием 2.2.1 SDK я получаю разные результаты для рассматриваемого NSOperationQueue для устройства, использующего 3.0, или устройства, использующего 2.2.1. Я подтвердил это на 1 iPod Touch с 2.2.1, на одном 3.0 и двух комплектах 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 для operationCount.

Не могу точно определить, почему это так. Все сборки скомпилированы по 2.2.1.

Примечание

Согласно ответу Мэтта ниже; «объект» равен нулю в 2.2.1. Это не ноль на 3.0.

1 Ответ

1 голос
/ 24 июня 2009

Значения, которые вы получаете, например, параметр object, буквально равны nil. Чтобы найти источник проблемы, вы можете проверить, что object и self.myOperationQueue - это одно и то же значение - если это так, то ваш self.myOperationQueue просто в странном состоянии. Если они не равны, то вы можете просто читать с self.myOperationQueue вместо object.

Однако вы используете опцию NSKeyValueObservingOptionNew, но не читаете значение, которое она вам дает. Смысл NSKeyValueObservingOptionNew в том, что он передает новое значение в словаре изменений.

т.е.

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

Если вы не хотите извлекать новое значение из словаря изменений, вам не нужно передавать значение NSKeyValueObservingOptionNew (вы можете просто передать 0).

...