Ios 添加每个键';s从NSDictionary到NSMutableArray的第一个对象

Ios 添加每个键';s从NSDictionary到NSMutableArray的第一个对象,ios,objective-c,nsdictionary,Ios,Objective C,Nsdictionary,我有一个NSMutableDictionary,其中包含自定义(PNMessage)对象,该对象还包含一个NSDictionary和两个其他字符串对象。每个键表示用户名,每个对象表示属于键的消息。 我想将属于特定用户(密钥)的最新对象复制到新的NSMutableArray。例如:我想复制属于密钥的最新对象:Tim和Bill 我知道字典是未排序的,但我在对象内部的每个字典(keyCreateDate)中都存储了一个带有日期的字符串,因此可以循环使用它们并识别最近的对象 这是已排序的消息dict在日

我有一个
NSMutableDictionary
,其中包含自定义(PNMessage)对象,该对象还包含一个
NSDictionary
和两个其他字符串对象。每个
表示用户名,每个
对象
表示属于键的消息。 我想将属于特定用户(密钥)的最新对象复制到新的
NSMutableArray
。例如:我想复制属于密钥的最新对象:Tim和Bill

我知道字典是未排序的,但我在对象内部的每个字典(keyCreateDate)中都存储了一个带有日期的字符串,因此可以循环使用它们并识别最近的对象

这是已排序的消息dict在日志中的外观:

{
    tim =     (
                 "PNMessage (0x1811a340): <message: {\n    keyCreateDate = \"06/09/14 21:24\";\n    keyMessage = \"Lorem ipsum\";\n    keyRecieverChannel = bill;\n    keySenderUser = tim;\n}, date: (null), channel: main>",
                 "PNMessage (0x16526ce0): <message: {\n    keyCreateDate = \"06/09/14 21:31\";\n    keyMessage = \"Lorem ipsum dolor\";\n    keyRecieverChannel = tim;\n    keySenderUser = bill;\n}, date: (null), channel: main>",
                 );
    bill =     (
                 "PNMessage (0x18109b00): <message: {\n    keyCreateDate = \"06/08/14 21:23\";\n    keyMessage = Hello World;\n    keyRecieverChannel = bill;\n    keySenderUser = tim;\n}, date: (null), channel: main>",
                 "PNMessage (0x18104070): <message: {\n    keyCreateDate = \"06/09/14 21:23\";\n    keyMessage = \"Hello Bill\";\n    keyRecieverChannel = bill;\n    keySenderUser = kyra;\n}, date: (null), channel: main>",
                 );
    dave =     (
               "PNMessage (0x1811a340): <message: {\n    keyCreateDate = \"06/09/14 21:24\";\n    keyMessage = \"Lorem ipsum\";\n    keyRecieverChannel = bill;\n    keySenderUser = tim;\n}, date: (null), channel: main>",
               "PNMessage (0x16526ce0): <message: {\n    keyCreateDate = \"06/09/14 21:31\";\n    keyMessage = \"Lorem ipsum dolor\";\n    keyRecieverChannel = tim;\n    keySenderUser = bill;\n}, date: (null), channel: main>",
               );

}
我想我应该遍历每个键的每个对象,检查每个对象内的
keyCreateDate
,并将最近的数据添加到
sampleArray
。我们在主词典中需要的关键字名称是
user

我从这开始,但在第一行之后就被绊倒了。作为第一步,我尝试检查
self.messagesDictionary
(具有用户密钥)中的每个
PNMessage
对象,然后记录1。对象它在模拟器中运行,但我看不到日志,所以它肯定是错的

   for(PNMessage *object in [self.messagesDictionary objectForKey:@"user"])
    {

        [object.message objectAtIndex:0];
        NSLog(@"the object is %@", object.message);
    }
更新:


公认的答案是正确的,但邓肯的答案也包含有用的相关建议

类似的内容将为您提供一个字典,其中包含每个用户字符串的最新消息

//Get newest message from each user. User(NSString *) => PNMessage*
NSMutableDictionary *newestMessageByUser = [NSMutableDictionary dictionary];
for (NSString *user in self.messagesDictionary) {
    NSArray *messages = self.messagesDictionary[user];
    newestMessageByUser[user] = messages.firstObject;
}

在我看来,你的结构和你的描述有点不同。我明白了:

一本外字典,有“tim”、“bill”和“dave”等键

字典中的每个条目都是PNMessage对象的数组。你从来没有提到过数组

在您发布的小示例中,消息对象数组似乎按照最早创建日期到最新创建日期的顺序进行排序

从您的描述中不完全清楚PNMessage对象是如何构造的。您的日志显示消息对象包含“keyCreateDate”和“keyMessage”的值。PNMessage对象是否包含字典,以及字典中每个消息对象的键

您可以发布PNMessage对象类的标题吗?您是PNMessage“keyCreateDate”和“keyMessage”中的键还是“CreateDate”和“Message”中的键(它们是否有前缀“key”

如果您的消息数组按数据所示从最早到最新排序,那么@ChrimsonChris的代码占99%

newestMessageByUser[user] = messages.lastObject;
(因为您说过希望在外部用户字典中为每个用户提供最新的消息,在我看来,每个数组中的第一个条目是最早的,最后一个条目是最新的。)

顺便说一句,他的for循环一开始有点混乱

for (NSString *user in self.messagesDictionary)
在外部字典上使用快速枚举

如果在Xcode文档中搜索字符串“Using fast enumeration with a dictionary”,您将发现以下信息:

快速枚举的行为根据类型略有不同 数组和集合枚举它们的内容,字典 列举他们的钥匙。

所以for循环将从外部字典中一次给您一个键


如果您的消息对象不在数组中,或者数组未按创建日期排序,则您必须调整ChrimsonChris的代码。

工作正常,它会过滤消息,但我会收到最新消息。我尝试了messages.lastObject,但不起作用。是否可以列出相反的方向?这从来都不是一个好主意复制并粘贴代码,看看它是否有效。此代码段是一个示例,您应该根据自己的需要进行调整。每种情况都不同,如果您能够理解此代码,就不需要使用复制粘贴解决方案。谢谢Duncan!我已经试过了.lastObject版本,但它还不起作用,我仍然很抱歉正在尝试..这是PNMessage的类引用。在本例中,message属性是一个字典。UPDATE:与.lastObject一起使用。@Duncan感谢您的详细介绍,特别是在快速枚举部分。
for (NSString *user in self.messagesDictionary)