Если вы создаете набор индексов во время перечисления или изменяете сам массив во время перечисления, вам придется отказаться от NSEnumerationConcurrent
, потому что большинство объектов Какао нельзя безопасно изменять одновременно из нескольких потоков.
В любом случае, самый простой (но, возможно, не самый эффективный) подход - просто перечислить копию контейнера.
Для массива вы можете перечислить копию в обратном порядке .Я предполагаю, что при перечислении каждого элемента вы можете решить удалить этот элемент, но не другие элементы, перечисленные ранее или еще не перечисленные.
NSMutableArray *array = [[rows objectForKey:self.company.coaTypeCode] objectForKey:statementType];
[[array copy] enumerateObjectsWithOptions: NSEnumerationReverse
usingBlock:^(id coaItem, NSUInteger idx, BOOL *stop) {
if ([self objectIsTooUglyToExist:coaItem])
[array removeObjectAtIndex:idx];
}]
Необходимо перечислить массив в обратном порядке, чтобы избежать измененияеще не перечислимая часть массива.
Для словаря вы можете просто перечислить копию без специальных опций:
NSMutableDictionary *dictionary = someDictionary;
[[dictionary copy] enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
if ([self object:obj isTooUglyToExistAtKey:key])
[dictionary removeObjectForKey:key];
}];