为什么核心数据 NSSet 会反转我的数组?

Why does Core data NSSet invert my array?

我有一个 segments 的数组,每个数组都有一个 fighters 的数组与之关联。

关系可以这样描述:

One `segment` can have many `fighters`

对象由核心数据管理。

当在 table 视图中显示时,每个单元格都有两个按钮,因此用户可以从单独的视图控制器中选择战士;然后当它 returns 时它会更新分段战斗机关系。

因为segment.fighters非mutableNSSet的关系,所以需要修改为;

如果

  1. 用户按下左键,这表明正在拾取 segment.fighter 中的第一个对象

  2. 用户按下右键,它推断 segment.fighter 中的最后一个对象正在被拾取

当我来更新关系时,有时;取决于用户按下的按钮顺序; NSSet中对象的位置颠倒了。

即:

Sometimes a fighter that should be at position 0 is swapped with a fighter at position 1, when this should never happen.

我的代码如下;

NSArray *currentFighters = [[segment valueForKeyPath:@"fighters"] allObjects];

NSLog(@"----- current fighters ---- ");
for (FCFighter *fighter in currentFighters) {
    NSLog(@"%@", [fighter description]);
}

NSMutableArray *currentFightersMutable = [currentFighters mutableCopy];
[currentFightersMutable replaceObjectAtIndex:fighterIdx withObject:pickedFighter];
NSArray *updatedFighters = [currentFightersMutable copy];


NSLog(@"----- updated fighters ---- ");
for (FCFighter *fighter in updatedFighters) {
    NSLog(@"%@", [fighter description]);
}

[segment setFighters:[NSSet setWithArray:updatedFighters]];

NSLog(@"----- [segment fighters] ---- ");
for (FCFighter *fighter in [[segment valueForKeyPath:@"fighters"] allObjects]) {
    NSLog(@"%@", [fighter description]);
}

我正在使用 NSMutable数组,以便我可以替换数组中的确切对象。

我可以通过日志证明它有效

Picked fighter - AJ Fonseca 
----- current fighters ---- 
AJ Matthews 
A Sol Kwon 
----- updated fighters ---- 
AJ Fonseca 
A Sol Kwon 
----- [segment fighters] ----   // NOTE it has swapped them, but why?
A Sol Kwon 
AJ Fonseca 
-[FCSegmentTableViewCell configureCellWithSegment:]
#0 -- A Sol Kwon 
#1 -- AJ Fonseca 

但是在分割战士输出时,战士被调换了;但我的问题是——

为什么 NSSet 会反转我的数组?

非常感谢

NSSet 是对象的无序集合。您使用 returns 数组的 属性 allObjects,但正如此方法的文档所述 "The order of the objects in the array is undefined.".

因此,每当您尝试从集合中取出一个数组时,您可能会得到不同的顺序。

为确保顺序不变,您应该 a) 为战士使用有序关系 - 但不是一个好主意,因为 NSOrderedSet 是数组和集合的混合体。 b) 对从 allObjects 返回的数组进行排序,以便顺序一致。这是我的首选方法。