2016-06-10 8 views
3

У меня есть функция, предназначенная для принятия объекта, и если в массиве уже существует одна строка с идентификатором, обновите ее, и если он не добавляет объект. Добавляемая часть работает, но по какой-то причине функциональность обновления теряет данные.Замена объекта в массиве не работает, но добавление нового Делает

Вот мой код:

- (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.

Любые мысли были бы очень оценены.

+0

1) Я удивлен, что этот код не сбой, так как вы изменяете изменяемый массив, пока используете с ним быстрое перечисление. 2) Этот код очень неэффективен. Зачем использовать быстрое перечисление и 'indexOfObject:'? Либо используйте обычный цикл 'for', чтобы вы уже знали индекс соответствующего объекта, либо использовали' enumerateObjectsUsingBlock: ', чтобы получить преимущества обоих. – rmaddy

+0

Спасибо за ввод, я думаю, что это не сбой, потому что цикл прерывается оператором return после того, как массив мутирован и до того, как цикл продолжится до другой итерации. Но я тоже попробую ваш метод. –

+0

Как вы определяете, что массив неправильно обновляется при вызове 'replaceObjectAtIndex:'? – rmaddy

ответ

1

Что-то вроде этого является более эффективным, безопасным, и (на мой взгляд) более читаемым:

- (void)addOrUpdateGroup:(Object *)myObject { 
    NSUInteger idx = [objectsArray indexOfObjectPassingTest:^(Object *object, NSUInteger idx, BOOL *stop) { 
     return [object.identifier isEqualToString:myObject.identifier]; 
    }]; 

    if (idx != NSNotFound) { 
     [objectsArray replaceObjectAtIndex:idx withObject:myObject]; 
    } else { 
     [objectsArray addObject:myObject];  
    } 
} 

Он предполагает, что objectsArray содержит только Object с.

+0

Спасибо за более эффективное решение, я не знал об этом методе. Однако ошибка все еще присутствует - новый объект не заменяется и не добавляется. Очевидно, проблема связана с вызовом метода replaceObjectAtIndex. –