Я написал быстрый метод, чтобы взять исходный массив (из объектов, которые все не в порядке) и ссылочный массив (который имеет объекты в желаемом (и совершенно произвольном) порядке), и возвращает массив, в котором элементы исходный массив был реорганизован для соответствия эталонному массиву.
- (NSArray *) reorderArray:(NSArray *)sourceArray toArray:(NSArray *)referenceArray
{
NSMutableArray *returnArray = [[NSMutableArray alloc] init];
for (int i = 0; i < [referenceArray count]; i++)
{
if ([sourceArray containsObject:[referenceArray objectAtIndex:i]])
{
[returnArray addObject:[arrReference objectAtIndex:i]];
}
}
return [returnArray copy];
}
Обратите внимание, что это очень хрупко. Он использует NSArray
containsObject:
метод, который в конечном итоге вызовет NSObject
'* isEqual:
. По сути, он должен отлично работать для массивов NSString
s, NSNumber
s и, возможно, NSDate
s (еще не пробовал), но вне этого, YMMV. Я полагаю, если бы вы попытались передать массивы UITableViewCell
s или какой-либо другой действительно сложный объект, он бы полностью сам себя закинул и либо вылетел, либо возвратил полный мусор. Точно так же, если вам нужно сделать что-то вроде передачи массива NSDate
с в качестве ссылочного массива и массива NSString
с в качестве исходного массива. Кроме того, если исходный массив содержит элементы, не включенные в ссылочный массив, они просто будут удалены. Можно решить некоторые из этих проблем, добавив немного дополнительного кода.
Все это говорит, что если вы пытаетесь сделать что-то простое, это должно работать хорошо. В вашем случае вы могли бы создать массив ссылок, когда вы просматриваете ваш setValue:forKey:
.
NSMutableArray *referenceArray = [[NSMutableArray alloc] init];
NSMutableDictionary *yourDictionary = [[ NSMutableDictionary alloc] init];
for (//whatever you are looping through here)
{
[yourDictionary setValue://whatever forKey:key];
[referenceArray addObject:key];
}
Затем, когда вы хотите перебрать свои предметы в порядке их поступления, вы просто
for (NSString *key in [self reorderArray:[myDict allKeys] toArray:referenceArray])