Наблюдение NSMutableArray для вставки/удаления

74
задан Slipp D. Thompson 5 September 2015 в 20:22
поделиться

4 ответа

, Но синтезируемые средства доступа не должен автоматически возвращать такой объект прокси?

, Что надлежащий путь состоит в том, чтобы работать вокруг этого - я должен записать пользовательское средство доступа, которое просто вызывает [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

я имею список всех форматов селектора средства доступа на моем блоге.

79
ответ дан Tim Potter 24 November 2019 в 12:02
поделиться

Я не использовал бы willChangeValueForKey и didChangeValueForKey в этой ситуации. Для одного они предназначены, чтобы указать, что значение в том пути изменилось, не, который оценивает в - многие, отношения изменяются. Вы хотели бы использовать willChange:valuesAtIndexes:forKey: вместо этого, если бы Вы сделали это этот путь. Несмотря на это, использование ручных уведомлений KVO как это является плохой инкапсуляцией. Лучший способ сделать его определяет метод addSomeObject: в классе, который на самом деле владеет массивом, который включал бы ручные уведомления KVO. Таким образом, вне методов, которые добавляют объекты к массиву, не должен волноваться об обработке KVO владельца массива также, который не был бы очень интуитивен и мог привести к ненужному коду и возможно ошибкам, если Вы начинаете добавлять объекты к массиву от нескольких мест.

В этом примере я на самом деле продолжил бы использовать mutableArrayValueForKey:. Я не положителен с изменяемыми массивами, но я полагаю от чтения документации, что этот метод на самом деле заменяет целый массив новым объектом, поэтому если производительность будет беспокойством, то Вы также захотите реализовать insertObject:in<Key>AtIndex: и removeObjectFrom<Key>AtIndex: в классе, который владеет массивом.

9
ответ дан Marc Charbonneau 24 November 2019 в 12:02
поделиться

Необходимо обернуть Ваш addObject: вызов в willChangeValueForKey: и didChangeValueForKey: вызовы. Насколько я знаю, нет никакого пути к NSMutableArray, который Вы - modifiying для знания о любых наблюдателях, наблюдающих за его владельцем.

0
ответ дан Ben Gottlieb 24 November 2019 в 12:02
поделиться

Ваш собственный ответ на ваш собственный вопрос почти правильный. Не объявляйте theArray извне. Вместо этого объявите другое свойство, theMutableArray, соответствующее никакой переменной экземпляра, и напишите этот аксессор:

- (NSMutableArray*) theMutableArray {
    return [self mutableArrayValueForKey:@"theArray"];
}

В результате другие объекты могут использовать thisObject.theMutableArray для внесения изменений в массив, и эти изменения вызывают KVO.

Другие ответы, указывающие на то, что эффективность повышается, если вы также реализуете insertObject:inTheArrayAtIndex: и removeObjectFromTheArrayAtIndex:, по-прежнему верны. Но нет необходимости, чтобы другие объекты знали о них или вызывали их напрямую.

3
ответ дан 24 November 2019 в 12:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: