У меня есть функция, предназначенная для принятия объекта, и если в массиве уже существует одна строка с идентификатором, обновите ее, и если он не добавляет объект. Добавляемая часть работает, но по какой-то причине функциональность обновления теряет данные.Замена объекта в массиве не работает, но добавление нового Делает
Вот мой код:
- (void)addOrUpdateGroup:(Object *)myObject
{
for (H2Group *existingObject in objectsArray) {
if ([existingObject.identifier isEqualToString:myObject.identifier]) {
[objectsArray replaceObjectAtIndex:[objectsArray indexOfObject:existingObject] withObject:myObject];
return;
}
}
[objectsArray addObject:myObject];
}
При вызове этого метода с объектом, который имеет аналог в массиве, он выполняет, но не похоже, чтобы заменить объект.
Использование контрольных точек и журналов, я установил, что:
- петля вводится, и обнаружение нового объекта с существующим идентификатором работает отлично.
- Новый объект не поврежден, и если я использую
[objectsArray addObject:myObject]
, объект будет добавлен правильно. - Та же проблема возникает, если я использую
replaceObjectAtIndex:0 withObject:myObject
.
Любые мысли были бы очень оценены.
1) Я удивлен, что этот код не сбой, так как вы изменяете изменяемый массив, пока используете с ним быстрое перечисление. 2) Этот код очень неэффективен. Зачем использовать быстрое перечисление и 'indexOfObject:'? Либо используйте обычный цикл 'for', чтобы вы уже знали индекс соответствующего объекта, либо использовали' enumerateObjectsUsingBlock: ', чтобы получить преимущества обоих. – rmaddy
Спасибо за ввод, я думаю, что это не сбой, потому что цикл прерывается оператором return после того, как массив мутирован и до того, как цикл продолжится до другой итерации. Но я тоже попробую ваш метод. –
Как вы определяете, что массив неправильно обновляется при вызове 'replaceObjectAtIndex:'? – rmaddy