KVO на iPhone на 3.0 срещу 2.2.1, има проблем

Изглежда, че 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, винаги ще връща нула за операции и 0 за operationCount.

Изглежда не мога да определя защо това е така. Всички компилации са компилирани спрямо 2.2.1.

ЗАБЕЛЕЖКА

Според отговора на Мат по-долу; 'object' е нула на 2.2.1. Не е нула на 3.0.


person Coocoo4Cocoa    schedule 23.06.2009    source източник
comment
Опитайте да използвате NSLog(), за да проверите стойността на обекта, а не GDB. Попаднах на странен проблем при изграждането на 2.2.1 с Xcode 3.1.3: openradar.me/7017295   -  person Martin Gordon    schedule 30.06.2009


Отговори (1)


Стойностите, които получавате, звучат така, сякаш параметърът object е буквално nil. За да откриете източника на проблема, можете да проверите дали object и self.myOperationQueue са еднакви стойности -- ако са, тогава вашият self.myOperationQueue просто е в странно състояние. Ако не са равни, тогава можете просто да прочетете от self.myOperationQueue вместо от object.

Вие обаче използвате опцията NSKeyValueObservingOptionNew, но не четете стойността, която ви дава. Смисълът на NSKeyValueObservingOptionNew е, че той предава новата стойност в речника за промяна.

i.e.

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

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

person Matt Gallagher    schedule 23.06.2009
comment
Хей, Мат, със сигурност си прав, когато предположи, че този обект е нула. Объркан съм защо обектът е нула, когато се изпълнява на устройство 2.2.1, но не и на устройство 3.0.. - person Coocoo4Cocoa; 24.06.2009