【问题标题】:Replacing Object in Array doesn't work, but Adding a new one Does替换数组中的对象不起作用,但添加一个新对象可以
【发布时间】:2016-06-10 02:39:06
【问题描述】:

我有一个旨在获取对象的函数,如果数组中已经存在具有相同标识符字符串的对象,则更新它,如果不存在,则添加该对象。添加部分有效,但由于某种原因,更新功能会丢失数据。

这是我的代码:

- (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: 来获得两者的好处。
  • 感谢您的输入,我认为它没有崩溃,因为在数组发生突变之后循环被 return 语句中断,并且在循环继续进行另一次迭代之前。不过我也会试试你的方法。
  • replaceObjectAtIndex: 被调用时,你如何确定数组没有正确更新?
  • 我在前后添加断点允许我检查 myObject 以及 objectsArray 的内容。
  • 我怀疑代码工作正常,问题在于您确定它不工作。我建议为您的Object 类编写一个适当的description 方法,以便它显示足够的信息以清楚地区分每个实例,然后在调用addOrUpdateGroup: 之前和之后记录objectsArray。然后确保日志输出有差异。或者问题可能只是existingObjectmyObject 实际上是同一个对象实例或者它们具有相同的数据。

标签: objective-c arrays nsarray


【解决方案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 仅包含Objects。

【讨论】:

  • 感谢更有效的解决方案,我不知道这种方法。但是,错误仍然存​​在——新对象既没有被替换也没有被添加。显然,问题在于 replaceObjectAtIndex 方法调用。
猜你喜欢
  • 1970-01-01
  • 2018-10-03
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
相关资源
最近更新 更多