#objective-c #key-value-observing
#objective-c #наблюдение за ключом-значением
Вопрос:
Если я @синтезирую свою собственность (исполнителя), все работает нормально
- добавьте наблюдателя для ключевого пути artist.name
- вызовите [myObj setValue:newArtist forKey:@»исполнитель»];
- Успех.
если я переопределю метод 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: