, Но синтезируемые средства доступа не должен автоматически возвращать такой объект прокси?
№
, Что надлежащий путь состоит в том, чтобы работать вокруг этого - я должен записать пользовательское средство доступа, которое просто вызывает
[super mutableArrayValueForKey...]
?
реализация номера средства доступа массива . При вызове их KVO отправит соответствующие уведомления автоматически. Таким образом, все, что необходимо сделать:
[myObject insertObject:newObject inTheArrayAtIndex:[myObject countOfTheArray]];
и Правильная Вещь произойдет автоматически.
Для удобства, можно записать addTheArrayObject:
средство доступа. Это средство доступа назвало бы одно из средств доступа действительного массива описанным выше:
- (void) addTheArrayObject:(NSObject *) newObject {
[self insertObject:newObject inTheArrayAtIndex:[self countOfTheArray]];
}
(Вы можете и должны заполнить надлежащий класс для объектов в массиве, вместо NSObject
.)
Затем вместо [myObject insertObject:…]
, Вы пишете [myObject addTheArrayObject:newObject]
.
К сожалению, add<Key>Object:
и его дубликат remove<Key>Object:
, в последний раз я проверил, только распознанный KVO за набор (как в NSSet) свойства, не свойства массива, таким образом, Вы не получаете бесплатные уведомления KVO с ними, если Вы не реализуете их сверху средств доступа, это действительно распознает. Я зарегистрировал ошибку об этом: x-radar://проблема/6407437
я имею список всех форматов селектора средства доступа на моем блоге.
Я не использовал бы willChangeValueForKey
и didChangeValueForKey
в этой ситуации. Для одного они предназначены, чтобы указать, что значение в том пути изменилось, не, который оценивает в - многие, отношения изменяются. Вы хотели бы использовать willChange:valuesAtIndexes:forKey:
вместо этого, если бы Вы сделали это этот путь. Несмотря на это, использование ручных уведомлений KVO как это является плохой инкапсуляцией. Лучший способ сделать его определяет метод addSomeObject:
в классе, который на самом деле владеет массивом, который включал бы ручные уведомления KVO. Таким образом, вне методов, которые добавляют объекты к массиву, не должен волноваться об обработке KVO владельца массива также, который не был бы очень интуитивен и мог привести к ненужному коду и возможно ошибкам, если Вы начинаете добавлять объекты к массиву от нескольких мест.
В этом примере я на самом деле продолжил бы использовать mutableArrayValueForKey:
. Я не положителен с изменяемыми массивами, но я полагаю от чтения документации, что этот метод на самом деле заменяет целый массив новым объектом, поэтому если производительность будет беспокойством, то Вы также захотите реализовать insertObject:in<Key>AtIndex:
и removeObjectFrom<Key>AtIndex:
в классе, который владеет массивом.
Необходимо обернуть Ваш addObject:
вызов в willChangeValueForKey:
и didChangeValueForKey:
вызовы. Насколько я знаю, нет никакого пути к NSMutableArray, который Вы - modifiying для знания о любых наблюдателях, наблюдающих за его владельцем.
Ваш собственный ответ на ваш собственный вопрос почти правильный. Не объявляйте theArray
извне. Вместо этого объявите другое свойство, theMutableArray
, соответствующее никакой переменной экземпляра, и напишите этот аксессор:
- (NSMutableArray*) theMutableArray {
return [self mutableArrayValueForKey:@"theArray"];
}
В результате другие объекты могут использовать thisObject.theMutableArray
для внесения изменений в массив, и эти изменения вызывают KVO.
Другие ответы, указывающие на то, что эффективность повышается, если вы также реализуете insertObject:inTheArrayAtIndex:
и removeObjectFromTheArrayAtIndex:
, по-прежнему верны. Но нет необходимости, чтобы другие объекты знали о них или вызывали их напрямую.