Будет ли [NSSet allObjects] возвращать массив с одинаковым порядком каждый раз?
У меня есть список пользовательских объектов, возвращаемых из .NET WebService, и я храню их, используя отношения To-Many из родительской enitity с Core Data.
Я хочу использовать NSSet в качестве источника данных для UITableView и нажимать новый контроллер в стек при выборе строки.
При использовании [NSSet allObjects]
возвращаемый массив всегда имеет один и тот же порядок? (Я думаю, не так, как наборы неупорядочены)
Если нет, как тогда я могу использовать NSArray *myArray = [mySet allObjects];
в cellForRowAtIndexPath
, чтобы получить имя для textLabel
ячейки, а затем снова в didSelectRowAtIndexPath
, чтобы назначить объект ViewController, который должен быть нажат?
У меня уже есть родительский объект, синтезированный в моем UITableViewDelegate
. Я также подумал о том, чтобы синтезировать NSArray
и использовать allObjects
только один раз в viewDidLoad
для создания, но это дублирование данных в памяти
Ответы
Ответ 1
Ваше решение, извлекая NSArray
один раз во время viewDidLoad
, является правильным. На самом деле вы не будете дублировать много памяти. Ваши объекты по-прежнему будут только в памяти; это просто, что ваши NSSet
и NSArray
будут содержать указатели на эти объекты.
Ответ 2
Там нет гарантии, что они будут в том же порядке, так как NSSet
не поддерживает (технически) порядок. Если так получилось, что объекты возвращаются в том же порядке каждый раз, то имейте в виду, что эта деталь реализации не документирована и потенциально может быть изменена в будущей версии фреймворков.
Чтобы процитировать документацию:
(-[NSSet allObjects]
возвращает) [a] n массив, содержащий элементы sets, или пустой массив, если в наборе нет элементов. Порядок объектов в массиве не определен.
(выделено курсивом)
Ответ 3
Используйте NSOrderedSet вместо NSSet.