Звучит так, как будто у вас сейчас слушатель сам решает, следует ли его удалить, и удаляет сам. Это проблематично, потому что (а) как вы говорите, это нарушает ваше перечисление, но (б) потому что это хитрая абстракция - если объект, который запускает «обновление», также не контролирует владение в списке слушателей напрямую, ваш шаблон проектирования может столкнуться с проблемами в любом случае. Я мог бы предложить переопределить слушателей обновлений следующим образом:
- (BOOL)update
и возвращает BOOL, указывающий, должен ли слушатель быть удален (или сохранен, в зависимости от вашей семантики). Тогда вы могли бы написать цикл так:
NSMutableSet * listenersToBeRemoved = [NSMutableSet set];
for (id<AProtocol> listener in _listeners) {
BOOL shouldRemove = [listener update];
if (shouldRemove) {
[listenersToBeRemoved addObject:listener];
}
}
// Do this if _listeners is a Set, or whatever the equivalent is.
[_listeners minusSet:listenersToBeRemoved];
Как и другие предлагали, если вы хотите разрешить слушателям удалять себя в процессе обновления, достаточно просто выполнить итерацию по локальной копии коллекции, а не по самой коллекции. Синтаксис этого зависит от того, является ли _listeners
массивом, набором или чем-то еще, но посмотрите другие ответы или документы.