Objective c 替换数组中的对象不会';不起作用,但添加一个新的会起作用
我有一个函数,用于获取一个对象,如果数组中已经存在具有相同标识符字符串的对象,则更新该对象,如果不存在,则添加该对象。添加部件可以工作,但由于某些原因,更新功能会丢失数据 这是我的密码:Objective c 替换数组中的对象不会';不起作用,但添加一个新的会起作用,objective-c,arrays,nsarray,Objective C,Arrays,Nsarray,我有一个函数,用于获取一个对象,如果数组中已经存在具有相同标识符字符串的对象,则更新该对象,如果不存在,则添加该对象。添加部件可以工作,但由于某些原因,更新功能会丢失数据 这是我的密码: - (void)addOrUpdateGroup:(Object *)myObject { for (H2Group *existingObject in objectsArray) { if ([existingObject.identifier isEqualToString:myO
- (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与object:myObject一起使用,则会出现相同的问题
如果您有任何想法,我们将不胜感激。这样的想法更有效、更安全,而且(在我看来)更具可读性:
- (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
s.1)我很惊讶这段代码没有崩溃,因为您在修改可变数组时使用了快速枚举。2) 这段代码效率很低。为什么要使用快速枚举和索引对象:
?或者使用普通的for
循环,这样您就已经知道匹配对象的索引,或者使用EnumerateObjectsSusingBlock:
来获得两者的好处。感谢您的输入,我认为它不会崩溃,因为在数组变异之后,循环继续进行另一次迭代之前,return语句会破坏循环。但是我也会尝试你的方法。当调用replaceObjectAtIndex:
时,你如何确定数组没有正确更新?我在前后添加断点,允许我检查myObject以及objectsArray的内容。我怀疑代码工作正常,问题在于你确定它是正确的它不起作用了。我建议为您的对象
类编写一个适当的描述
方法,以便它显示足够的信息来清楚区分每个实例,然后在调用addOrUpdateGroup:
前后记录objectsArray
。然后确保日志输出中存在差异。或者问题仅仅在于existingObject
和myObject
实际上是同一个对象实例,或者它们具有相同的数据。感谢更有效的解决方案,我没有意识到这种方法。但是,错误仍然存在-新对象既没有被替换也没有被添加。显然,问题在于replaceObjectAtIndex方法调用。