Значения, не добавляющиеся к моему NSMutableDictionary

#iphone #xcode #nsdictionary #nsmutabledictionary

#iPhone #xcode #nsdictionary #nsmutabledictionary

Вопрос:

Я пытаюсь динамически добавлять некоторые значения в NSMutableDictionary. Однако, используя следующий код, я добавляю значения, используя первую букву в качестве ключа во временный словарь, а затем, наконец, добавляю его в свой словарь имен, но он просто перезаписывает каждое значение для соответствующего ключа

 NSMutableDictionary *dictionary = [[[NSMutableDictionary alloc] init] autorelease];
for (NSString *drugStr in listContents) {
    NSString *substring = [drugStr substringToIndex:1];
    [dictionary setValue:drugStr forKey:substring];     
}
names = [[NSDictionary alloc] initWithDictionary:dictionary];
[dictionary release];
  

Что я делаю не так?

Комментарии:

1. Вы знаете, что ключи в словаре должны быть уникальными? Из кода видно, что если у вас есть два лекарства, начинающихся с одной и той же буквы в listContents, второе перезапишет значение первого.

2. Что вы подразумеваете под «он просто перезаписывает каждое значение для соответствующего ключа»? Вы пытаетесь создать массивы всех значений, начинающихся с определенной буквы?

3. Не могли бы вы более четко указать, на что вы надеялись, что код будет выполнять вместо «просто перезаписывать каждое значение для соответствующего ключа»? Предположим, что список содержит «аспирин», «парацетамол», «фентермин»; что вы хотите names добавить в конец и что вы получаете вместо этого?

4. Я пытаюсь воспроизвести список, содержащий имена, которые классифицируются по их первой букве, например, ‘Aspirin’ и ‘Annadin’, оба будут находиться под ключом ‘A’. Я знаю, что ключи должны быть уникальными, но я пытаюсь добавить значение вместе с соответствующим ключом.

Ответ №1:

Вы должны определить свой NSDictionary так, чтобы использовать NSString в качестве ключа и NSArray в качестве значения.

Затем вы должны просто получить свое значение в соответствии с заданным ключом. Если результат равен нулю, то вам нужно создать новый NSMutableArray, к которому вы добавляете указанное выше значение. ЕСЛИ результат не равен нулю, добавьте значение в массив.

 NSMutableDictionary *dictionary = [[[NSMutableDictionary alloc] init] autorelease];
for (NSString *drugStr in listContents) {
    NSString *substring = [drugStr substringToIndex:1];
    NSMutableArray *valueArray = (NSMutableArray*)[dictionary objectForKey:substring];
     if(valueArray==nil){
         NSMutableArray *newArray = [NSMutableArray arrayWithCapacity:5];
         [newArray addObject:drugStr];
         [dictionary setObject:newArray forKey:substring];
     }else{
         [valueArray addObject:drugStr];
     }

}
names = [[NSDictionary alloc] initWithDictionary:dictionary];
[dictionary release];
  

Комментарии:

1. Спасибо за ответ, код сработал, но после его добавления мое приложение значительно замедлилось, вы можете понять, почему?

2. Вы испытываете замедление при создании словаря или есть другие замедления, которых вы не ожидали? Этот метод выделяет несколько изменяемых массивов во время выполнения функции, но не до такой степени, чтобы это могло вызвать проблемы. Что говорит ваш профилировщик xcode?

3. Если я закомментирую код, приложение будет работать нормально, хотя я не понимаю, почему это может вызвать тот эффект, который оно производит. Насколько я знаю, профилировщик Xcode не использовался, я предполагаю, что он находится в отладчике.

4. Поэтому попробуйте запустить профилировщик процессора xcode. Это расскажет вам, почему ваше приложение замедляется. На самом деле мне самому любопытно, вот почему я спрашиваю.

5. Я запустил приложение через профилировщик процессора, и оно показало, что mach_msg_trap работает со скоростью 47,3%, которая разбивается на mach_msg> _CFRunLoopServiceMachPort (Core Foundation) mach_port_insert_member, task_threads, task_suspend (libSystem.B.dylib). Под ним находятся keyevent (24%) и _Bzero (22%)