2016-02-25 2 views
0

У меня есть массив из segments, у каждого из них есть массив связанный с ним fighters.Почему основные данные NSSet инвертируют мой массив?

Отношения могут быть описаны таким образом:

One `segment` can have many `fighters` 

объекты находятся под управлением основных данных.

При отображении в виде таблицы каждая ячейка имеет две кнопки, поэтому пользователь может выбрать истребитель из отдельного контроллера вида; и тогда, когда он вернется, он обновит отношения между истребителями сегмента.

Потому что отношение segment.fighters не изменяет NSSet, мне нужно изменить его так, чтобы;

Если

  1. Пользователь нажимает левую кнопку, это делает вывод о том, что первым объектом в segment.fighter настоящее время выбрали

  2. Пользователь нажимает правую кнопку, он делает вывод, что последний объект в сегменте .fighter выбирается

Когда я прихожу, чтобы обновить отношения, иногда; в зависимости от последовательности кнопок, нажатых пользователем; позиции объектов в NSSet инвертируются.

т.е.

Иногда боец, который должен быть в положении 0 обменена с бойцом в положении 1, когда это никогда не должно произойти.

Мой код выглядит следующим образом;

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]); 
} 

Я использую NSMutableArray, чтобы заменить точный объект в массиве.

Я могу доказать, что он работает с помощью бревен

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 инвертирует массив?

Большое спасибо

+0

Кроме того, я хочу только обновить конкретный боец ​​в данном сегменте; а не весь массив для целей скорости. – zardon

ответ

1

An NSSet представляет собой неупорядоченный набор объектов. Свойство allObjects, которое вы используете, возвращает массив, но поскольку в документации для этого метода указано «Порядок объектов в массиве не определен».

Из-за этого, всякий раз, когда вы пытаетесь получить массив из своего набора, вы можете получить другой порядок.

Чтобы убедиться, что заказы не изменяются, вы должны либо a) использовать упорядоченные отношения для бойцов, но не так хорошо, как NSOrderedSet - это смесь между массивом и множеством.b) применить сортировку к массиву, возвращенному с allObjects, чтобы порядок был согласованным. Это мой предпочтительный метод.

+0

Я рассмотрю это, но я считаю, что использование NSMutableSet также может работать; но я тоже попробую вашу идею – zardon

+0

NSMutableSet по-прежнему является NSSet; и по-прежнему неупорядочен. – Abizern

+0

О, хорошо. Я буду использовать предикат для сортировки массива, который соответствует – zardon

Смежные вопросы