2016-06-10 56 views
3

我有一個設計用來取對象的函數,並且如果在數組中存在具有相同標識符字符串的函數,請更新它,if它不,添加對象。添加部分工作,但由於某種原因,更新功能會丟失數據。替換陣列中的對象不起作用,但添加一個新對象

這裏是我的代碼:

- (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方法調用。 –

相關問題