如何重构 NSDictionaries 的对象

How to restructure object of NSDictionaries

在我的调试器中,这是我的日志语句打印消息对象的方式:

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}"
)
  1. 这到底是什么?它看起来像一个字典对象,但 objectId 和 localId 变量在花括号之外,所以我不确定。

  2. 如何重组它以便我可以单独拥有每个单独的词典?

我从 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 的对象。你可以通过它的索引

得到需要的对象

更新:

我当然不能确定。我不知道 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 实现了一个类似字典的接口,即 fully described here.

出于对他人的尊重,将它们键入 id 并使用 KVO 访问它们的属性过于笼统。此外,messageBody 似乎是一个字符串类型的列。把它当作字典来处理是徒劳的。

PF对象应该这样处理:

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 需要的新数组(table 的对话),并且 (b) 我认为您“实际上是在寻找 senderName,这可能意味着对您实现解析对象之间关系的方式的重大改变。

我会尝试进一步回答另一个问题,但这个问题显然是相关的。