【问题标题】:One more "Mutated while being enumerated" issue另一个“枚举时发生突变”问题
【发布时间】:2014-12-10 06:09:51
【问题描述】:

我遇到了“Collection <_NSFaultingMutableSet: 0x7fac9c011190> was mutated while being enumerated”问题。

我知道这意味着什么,我在 SO 上找到了它。我发现了导致此异常的行。但我仍然无法得到我在这里变异的确切内容。你能帮我弄清楚吗?

- (void)addEntitiesObject:(Entity *)value {
    for (Group* group in value.groups) {
        Group* groupToAddObjectTo = nil;
        for (Group* tabGroup in self.tab.groups) {
            if (group.title == tabGroup.title) {
                groupToAddObjectTo = tabGroup;
            }
        }
        if (!groupToAddObjectTo)
            groupToAddObjectTo = [self.fetchController createGroup];

        groupToAddObjectTo.title = group.title;
        [groupToAddObjectTo addEntitiesObject:value]; //THIS LINE IS A TROUBLE
        [self.tab addGroupsObject:groupToAddObjectTo];
    }
}

导致问题的方法addEntitiesObject 是由XCode 生成的,带有“Create NSManagedObject subclass...”。我从不定义它。

方法“createGroup”只在CoreData中插入新组

    Group* group = (Group*)[NSEntityDescription insertNewObjectForEntityForName:@"Group" inManagedObjectContext:self.managedObjectContext];

并返回组。

所以我的意思是我没有使用groupToAddObjectTo,而它在分配给NSSet元素的循环中,那么这里有什么问题?

【问题讨论】:

  • “addEntitiesObject”在哪里定义,它是否修改了 value 或 value.groups?因为您正在迭代 value.groups,这将是一个问题。
  • @RobP 我没有定义它。它由 XCode 在 Groups 类中声明。我从不定义它,因为它可能由 CoreData 定义。所以我不知道它到底在做什么。
  • 您是否有从组回到value.groups 的反向关系?如果是这样,这将导致您的问题,因为当您向组添加值时, value.groups 将发生变异
  • @Paulw11 self.tab.groups 是 NSSet,self.tab 是 NSManagedObject。是的,它确实具有反比关系。让我检查一下,如果我删除反向关系,它是否有效。
  • @Paulw11 崩溃已经过去。所以你是对的,这就是问题所在。能否请您给出答案,以便我接受。我认为其他人也会从中受益。非常感谢,感谢您的帮助!

标签: ios objective-c fast-enumeration


【解决方案1】:

如果您的组与value 实体之间存在反向关系,则将实体添加到组将修改value.groups 属性 - 这将导致您的错误,因为您的外部循环正在枚举value.groups

要么删除反向关系,要么如果需要保留它,复制value.groups 属性并枚举副本。

【讨论】:

  • 你能解释一下吗?或者你能举个简单的例子吗?
  • 哪一部分需要多解释?如果您在迭代集合时对其进行了变异,则会出现异常。在问题中,代码在某些情况下会添加一个新的 Group 实体。然后它设置从该组到value 实体的关系。由于存在反向关系,Core Data 更新 value 实体的 groups 集以引用新的 Group - 这是由外部 for 循环枚举的集,因此抛出异常
猜你喜欢
  • 2012-09-21
  • 2012-07-30
  • 2011-10-04
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
相关资源
最近更新 更多