IOS сортировать изменяемый порядок словаря
Я видел много примеров на SO, но я не уверен, относится ли это к этой ситуации. Везде написано, что NSMutableDictionries не гарантирует порядок... но я получаю свои данные с сервера... поэтому мой NSMuteDic выглядит так:
{
joe = (
{
fromName = joe;
id = 25;
theMessage = "this is going to be a really big message...";
timeAdded = "2014-04-07 21:08:12";
toName = "me";
},
{
fromName = joe;
id = 10;
theMessage = "why???";
timeAdded = "2014-04-05 20:10:04";
toName = "me";
}
);
bob = (
{
fromName = "me";
id = 24;
theMessage = "blah blah";
timeAdded = "2014-04-06 21:15:06";
toName = bob;
},
{
fromName = bob;
id = 22;
theMessage = message;
timeAdded = "2014-04-06 20:11:57";
toName = "me";
}
);
//more entries here
}
Что я хочу сделать, так это изменить порядок... сначала поставь Боба, а потом Джо. Это действительно невозможно сделать? Я видел много очень сложных решений... нет простого способа сделать это с помощью цикла for?
cellForRowAtIndexPath: NSMutableArray * temp = [myDict objectForKey: keys [indexPath.row]]; cell.Message.text = [[reverse lastObject] valueForKey: @ "theMessage"]; cell.dateTime.text = [[reverse lastObject] valueForKey: @ "timeAdded"]; возвратная ячейка;
Вот как я это использую... и когда строка выбрана, я передаю массив следующему контроллеру представления. Причина, по которой я хочу изменить порядок, заключается в том, что если в контроллер push-представления будет вставлено новое сообщение, я хочу, чтобы этот словарь был первым в списке, чтобы можно было изменить порядок корневого контроллера представления.
NSArray *keys = [myDict allKeys];
[myDict removeObjectForKey:to];
NSMutableDictionary *temp = [NSMutableDictionary dictionaryWithCapacity:[myDict.count];
temp = myDict;
[myDict removeAllObjects];
[myDict setObject:currentDict forKey:to];
for (int i=0; i<temp.count; i++) {
[myDict setObject:[temp valueForKey:keys[i]] forKey:keys[i]];
}
Это не работает, потому что похоже, что поскольку myDict является NSObject, temp изменяется каждый раз, когда изменяется myDict... исходя из того, что логика должна работать, но это не так...
2 ответа
NSMutableDictionary не упорядочен. Вы ничего не можете сделать, чтобы гарантировать порядок ключей, потому что NSDictionary не пытается сохранить какой-либо конкретный порядок. Чтобы просмотреть словарь в определенном порядке, вы должны создать массив ключей в нужном вам порядке, затем выполнить итерацию и получить соответствующие значения.
// Get the keys
NSArray *keys = [myDict allKeys];
// Sort the keys
NSArray *sortedArray = [NSArray arrayWithArray:[keys sortedArrayUsingComparator:^(NSString* a, NSString* b) {
return [a compare:b];
}]];
// Iterate the dictionary
for (NSUInteger n = 0 ; < [sortedArray count]; n++) {
id value = [myDict objectForKey:[sortedArray objectAtIndex:n]];
}