Соответствует ли это Ключевое Значение?

#objective-c #key-value-observing

#objective-c #наблюдение за ключом-значением

Вопрос:

Если я @синтезирую свою собственность (исполнителя), все работает нормально

  1. добавьте наблюдателя для ключевого пути artist.name
  2. вызовите [myObj setValue:newArtist forKey:@»исполнитель»];
  3. Успех.

если я переопределю метод setter с помощью этого:

 - (void)setArtist:(GVArtist *)artist
{
   GVArtist *oldArtist = _artist;

   [self willChangeValueForKey:@"artist"];
   _artist = [artist retain];
   [self didChangeValueForKey:@"artist"];

   [oldArtist release];
}
  

и, сделав это снова, я получаю:

Не удается обновить для наблюдателя путь к ключу «artist.name » from , скорее всего, потому, что значение ключа «исполнитель» изменилось без отправки соответствующего уведомления KVO. Проверьте соответствие KVO класса MyObject.

Хотя для меня это выглядит нормально ….?

Ответ №1:

Вам не нужны willChangeValueForKey: и didChangeValueForKey: прочее; все это обрабатывается автоматически, если имя вашего установщика соответствует KVO (что -setArtist: и есть.) Когда вы регистрируете наблюдателя на myObj , Cocoa динамически создает подкласс вашего объекта и автоматически добавляет вызовы willChangeValueForKey: и didChangeValueForKey: . Таким образом, вашему установщику не нужно выполнять это вручную, и это может вызвать ваши проблемы.

Комментарии:

1. АРГУМЕНТ! Мозговой пердеж. Вы полностью правы. Мне нужно было бы реализовать это только для массива, верно? Заменит:valuesAtIndexes:forKey: