如何重构NSDictionaries的对象
在我的debugging器中,这是我的日志语句如何打印我的消息对象:
self.messages = ( "<lean: 0x7fcf98665140, objectId: vglE1UJ5KI, localId: (null)> {\n messageBody = Jj;\n recipientId = XvvxETqjph;\n senderId = XvvxETqjph;\n timestamp = \"1424991590106.210938\";\n}", "<lean: 0x7fcf98667940, objectId: rgBFYBMKlU, localId: (null)> {\n messageBody = \"test 3 from ian\";\n recipientId = XvvxETqjph;\n senderId = Hoy7UjLzOh;\n timestamp = \"1424631667110.638184\";\n}", "<lean: 0x7fcf98667f30, objectId: hB5uhwsYsu, localId: (null)> {\n messageBody = \"test 2 from user1\";\n recipientId = XvvxETqjph;\n senderId = VQzxWbDnal;\n timestamp = \"1424630904935.162109\";\n}", "<lean: 0x7fcf986685b0, objectId: dOe2B9oq5b, localId: (null)> {\n messageBody = \"test 1\";\n recipientId = XvvxETqjph;\n senderId = XvvxETqjph;\n timestamp = \"1424630808309.478027\";\n}" )
-
这究竟是什么? 它看起来像一个字典的对象,但objectId和localIdvariables超出花括号,所以我不知道。
-
我如何重组这个以便我可以自己拥有每个单独的字典?
我从parse.com上的后端获取这些数据:
-(void)viewWillAppear:(BOOL)animated{ NSString *userId = [[PFUser currentUser] objectId]; PFQuery *query = [PFQuery queryWithClassName:@"lean"]; [query whereKey:@"recipientId" equalTo:userId]; [query orderByDescending:@"createdAt"]; [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { if (error) { NSLog(@"Error: %@ %@", error, [error userInfo]); } else { // We found messages! masterMessages = (NSDictionary *)objects; NSLog(@"self.messages = %@", masterMessages); [self.tableView reloadData]; } }]; }
这是一个简单的NSArray
,它包含名为lean
的types的对象。 您可以通过索引获取所需的对象
更新:
我当然不能确定。 我不知道lean
的结构。 但很可能它包含名为messageBody
字段(我认为它必须是一个属性)。 如果真的如此,那么你可以做到以下几点:
NSMutableArray* messagesBySenderName = [NSMutableArray new]; for (id lean in objects) { NSDictionary *messageBody = [lean valueForKeyPath:@"messageBody"]; if ([lean[@"senderId"] isEqualToString:@"Hoy7UjLzOh"]) { [messagesBySenderName addObject:messageBody]; } }
再次 – 这只是一个假设。 在任何情况下,我都不能保证它能正常工作
它们是PFObject
(来自parse.com框架),PFObject以这种特殊的方式实现了description
。 PFObjects实现了一个类似字典的界面, 在这里完整描述 。
在尊重他人的情况下,将其input为id
并使用KVO访问其属性已经过于普遍了。 此外, messageBody
似乎是一个stringtypes的列。 作为字典对待将是徒劳无功的。
PFObjects应该这样处理:
for (PFObject *pfObject in objects) { NSString *objectId = [pfObject objectId]; NSDate *createdAt = [pfObject createdAt]; NSString *messageBody = [pfObject objectForKey:@"messageBody"]; NSString *senderId = [pfObject objectForKey:@"senderId"]; // and so on NSLog(@"This object has id %@ created at %@, senderId %@", objectId, createdAt, senderId); }
我知道你最近的另一个问题如何从这个数组派生senderIds数组。 从这段代码中提取senderId应该是显而易见的,但是(a)你可能不需要一个基于你的UI需求的新数组(一个对话表),和(b)我想你实际上是在寻找senderName,这可能意味着您已经实现了parsing对象之间的关系的实质性改变。
我会试着再回答这个问题,但是这个问题显然是相关的。