Как мне обновить объект в NSMutableArray?

Я пытаюсь обновить объект в NSMutableArray.

Product *message = (Product*)[notification object];
Product *prod = nil;

for(int i = 0; i < ProductList.count; i++)
{
    prod = [ProductList objectAtIndex:i];
    if([message.ProductNumber isEqualToString:prod.ProductNumber])
    {
        prod.Status = @"NotAvaiable";
        prod.Quantity = 0;
        [ProductList removeObjectAtIndex:i];
        [ProductList insertObject:prod atIndex:i];
        break;
    }
}

Есть ли лучший способ сделать это?

Ответ 1

Удалить строки:

[ProductList removeObjectAtIndex:i];
[ProductList insertObject:prod atIndex:i];

и это будет хорошо!

Ответ 2

Для обновления используйте

- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject

Но в этом случае он не нужен, так как вы изменяете один и тот же объект.

Ответ 3

Вы можете начать с быстрого перечисления, который быстрее и проще читать. Кроме того, вам не нужно удалять и вставлять объект, вы можете просто отредактировать его в строке. Вот так:

Product *message = (Product*)[notification object];

for(Product *prod in ProductList)
{
    if([message.ProductNumber isEqualToString:prod.ProductNumber])
    {
        prod.Status = @"NotAvailable";
        prod.Quantity = 0;
        break;
    }
}   

(Is ProductList объект? Если это так, он должен начинаться с буквы нижнего регистра: ProductList. Заглавные имена для классов. Кроме того, Status и Quantity являются свойствами и также должны начинаться с строчная буква. Я настоятельно рекомендую вам следовать Cocoa соглашениям об именах.)

Ответ 4

Используйте -insertObject:atIndex: или replaceObjectAtIndex:withObject:.

Ответ 5

Существует два подхода

  • Создайте новый объект и замените старый объект новым объектом
for(int i = 0; i < ProductList.count; i++)         
   {
      prod = [ProductList objectAtIndex:i];
      if([message.ProductNumber isEqualToString:prod.ProductNumber])
       {
           newObj = [[Product alloc] autorelease];
           newObj.Status = @"NotAvaiable";
           newObj.Quantity = 0;
           [ProductList replaceObjectAtIndex:i withObject:newObj];
           break;
       } 

     }

Обновить существующий объект:

for(int i = 0; i < ProductList.count; i++)
    {
        prod = [ProductList objectAtIndex:i];
        if([message.ProductNumber isEqualToString:prod.ProductNumber])
        {
            prod.Status = @"NotAvaiable";
            prod.Quantity = 0;
            break;
        }
    }