为什么核心数据 NSSet 会反转我的数组?
Why does Core data NSSet invert my array?
我有一个 segments
的数组,每个数组都有一个 fighters
的数组与之关联。
关系可以这样描述:
One `segment` can have many `fighters`
对象由核心数据管理。
当在 table 视图中显示时,每个单元格都有两个按钮,因此用户可以从单独的视图控制器中选择战士;然后当它 returns 时它会更新分段战斗机关系。
因为segment.fighters
非mutableNSSet
的关系,所以需要修改为;
如果
用户按下左键,这表明正在拾取 segment.fighter 中的第一个对象
用户按下右键,它推断 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
返回的数组进行排序,以便顺序一致。这是我的首选方法。
我有一个 segments
的数组,每个数组都有一个 fighters
的数组与之关联。
关系可以这样描述:
One `segment` can have many `fighters`
对象由核心数据管理。
当在 table 视图中显示时,每个单元格都有两个按钮,因此用户可以从单独的视图控制器中选择战士;然后当它 returns 时它会更新分段战斗机关系。
因为segment.fighters
非mutableNSSet
的关系,所以需要修改为;
如果
用户按下左键,这表明正在拾取 segment.fighter 中的第一个对象
用户按下右键,它推断 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
返回的数组进行排序,以便顺序一致。这是我的首选方法。