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

}
Другие вопросы по тегам