извлечение значения из NSMutableDictionary

Вот мой код для возврата уникального значения для идентичных ключей в словаре. Прямо сейчас в моем журнале мой «массив объектов:» равен 6 (3 набора (2 объекта с одинаковыми ключами)), а мой «словарь:» возвращает значения для 1 объекта из каждого набора (3 уникальных значения). В моем заявлении "за":

for (id key in dict)
{
       self.titlesArray = [NSMutableArray arrayWithObject:dict];
       NSLog(@"titles: %@", self.titlesArray);
       self.titlesArray = [[NSMutableArray alloc] initWithObjects:[dict valueForKey:key] ,nil];
       NSLog(@"titles: %@", self.titlesArray);

}

В первом журнале печатаются три уникальных значения и ключи. Второй выводит только одно значение для одного ключа (это то, что я хочу .. но мне нужны все три ключевых значения) Итак, моя проблема теперь в том, что я не могу вытащить ключ для каждого уникального значения из словаря и добавить его к моим заголовкамArray.

for (id key in dict) 
{
    self.titlesArray = [NSMutableArray arrayWithObject:dict];
    self.titlesArray = [[NSMutableArray alloc] initWithObjects:[dict valueForKey:key] ,nil];

код не совсем правильный.

    PFQuery *query = [PFQuery queryWithClassName:@"Images"];
    [query whereKey:@"recipientIds" equalTo:[[PFUser currentUser] objectId]];
    [query orderByDescending:@"createdAt"];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (error) {
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }
        else {

            // found messages!
            self.objectsArray = objects;

            NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
            for(id obj in self.objectsArray){
                PFObject *key = [obj valueForKey:@"titleLabel"];

                if(![dict objectForKey:key]){
                    [dict setValue:key forKey:[obj valueForKey:@"titleLabel"]];
                }
            }
            for (id key in dict) {
                self.titlesArray = [NSMutableArray arrayWithObject:dict];
NSLog(@"titles: %@", self.titlesArray);
                self.titlesArray = [[NSMutableArray alloc] initWithObjects:[dict valueForKey:key] ,nil];
NSLog(@"titles: %@", self.titlesArray);
            } 
            NSLog(@"dictionary: %@", dict);
            NSLog(@"Objects array is %d", [self.objectsArray count]);

            [self.pickerView reloadComponent:0];

person Jared Gross    schedule 19.10.2013    source источник


Ответы (4)


похоже, что в строке есть какая-то ошибка типа

PFObject *key = [self.objectsArray valueForKey:@"titleLabel"];

должен быть

 PFObject *key = [obj valueForKey:@"titleLabel"];
person Rocker    schedule 19.10.2013
comment
Я думаю, что он пытается передать то, что он получит в ответ от этого вызова [self.objectsArray valueForKey:@"titleLabel"], в качестве ключа для объекта в словаре. - person Priyatham51; 19.10.2013

Это происходит в этой строке, не так ли:

 if(![dict objectForKey:@"titleLabel"]){
            [dict setValue:obj forKey:key];
        }
    }

Вы устанавливаете «obj» в качестве значения, здесь нет проблем, но затем вы используете «ключ», который является PFObject, но NSDictionary требует NSString для ключа.

Если PFObject содержит свойство NSString, которое вы хотите использовать, вы можете передать его. Например, если PFObject имеет свойство NSString с именем «name», вы можете назвать это:

if(![dict objectForKey:@"titleLabel"]) {
           [dict setValue:obj forKey:key.name];
        }
    }

Следует обратить внимание на типы параметров, когда NSMutableDictionary определяет этот метод, а именно (NSString *):

 - (void)setValue:(id)value forKey:(NSString *)key
person ryan cumley    schedule 19.10.2013
comment
Я обновил свой вопрос, чтобы показать определение PFObject и ключей. То, что вы сказали, имеет для меня смысл в отношении доступа к строковому свойству, хотя я пытался использовать точечную нотацию для доступа к нему, но ошибка говорит, что свойство не найдено. Он сохраняется в серверной части (Parse) в виде строки, потому что я проверил ... поэтому я не понимаю, почему я не могу получить к нему доступ как таковой. - person Jared Gross; 19.10.2013
comment
Если PFObject является подклассом NSMutableDictionary, тогда вам нужно будет выполнить полное [image objectForKey: somekey], предполагая, что возвращаемый объект является NSString, тогда вы можете передать эту строку в качестве ключа в вашем [dict setValue: obj forKey :] утверждение. Нотация точечного доступа работает со свойствами объектов, а не с парами ключ / объект словаря. - person ryan cumley; 19.10.2013
comment
Попался. Ну, я немного поработал над этим и добился некоторого прогресса. Я обновил свой исходный вопрос и код, чтобы отразить мое текущее состояние. Теперь я могу получить одно уникальное значение для ключа, но у меня все еще возникают проблемы с получением уникального значения для каждого ключа в моем словаре. - person Jared Gross; 21.10.2013

Как выглядит ваш PFObject. В нем есть струны? Согласно вашему вопросу вы уже знаете, что вы не можете передать PFObject в качестве ключа для словаря. Если ваш объект что-то вроде этого

interface PFObject : NSObject

{
    NSString *keyString;
    ......
    .Some other variables
}

Тогда вы должны использовать его так, чтобы установить его как ключ

PFObject *key = [self.objectsArray valueForKey:@"titleLabel"];

            if(![dict objectForKey:@"titleLabel"]){
                [dict setValue:obj forKey:[key valueForKey@"titleLabel"]];
            }
person Priyatham51    schedule 19.10.2013
comment
Я обновил свой вопрос, чтобы показать определение PFObject. Я попытался использовать точечную нотацию для доступа к свойству, но выдает ошибку: свойство не найдено. Parse хранит ключ в виде строки, поэтому я не понимаю, почему я не могу получить к нему доступ как таковой - person Jared Gross; 19.10.2013
comment
Благодарность! это не решило проблему, но помогло мне взглянуть на это по-другому, чтобы я смог продвинуться немного дальше. Тем не менее, все еще застрял. - person Jared Gross; 21.10.2013
comment
Хорошо, вы можете обновить свой вопрос, показывая, где вы застряли. - person Priyatham51; 21.10.2013
comment
Я на самом деле только что получил это, хотя мне все еще нужно проанализировать это, чтобы точно выяснить, что происходит. Но опубликованный мной код возвращает только уникальные значения для заданных ключей. Спасибо за помощь! - person Jared Gross; 21.10.2013

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

PFQuery *query = [PFQuery queryWithClassName:@"Images"];
    [query whereKey:@"recipientIds" equalTo:[[PFUser currentUser] objectId]];
    [query orderByDescending:@"createdAt"];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (error) {
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }
        else {
            // found messages!
            self.objectsArray = objects;

            NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
            for(id obj in self.objectsArray){
                PFObject *key = [obj valueForKey:@"titleLabel"];

                if(![dict objectForKey:key]){
                    [dict setValue:key forKey:[obj valueForKey:@"titleLabel"]];
                }
            }
            for (id key in dict) {
                self.titlesArray = [NSMutableArray arrayWithObject:dict];
                [self.titlesArray addObject:dict.allKeys];
                self.titlesArray = [self.titlesArray objectAtIndex:1];
            }
            NSLog(@"titles: %@", self.titlesArray);

            [self.pickerView reloadComponent:0];
person Jared Gross    schedule 21.10.2013
comment
Рад, что вы это поняли, я наконец понял, что PFObject - это не класс, который вы написали, а библиотека с онлайн-документацией. Я бы, наверное, сделал для вас более полезные комментарии, если бы понял, что раньше ... - person ryan cumley; 21.10.2013