如何重构 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}"
)
这到底是什么?它看起来像一个字典对象,但 objectId 和 localId 变量在花括号之外,所以我不确定。
如何重组它以便我可以单独拥有每个单独的词典?
我从 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,这可能意味着对您实现解析对象之间关系的方式的重大改变。
我会尝试进一步回答另一个问题,但这个问题显然是相关的。
在我的调试器中,这是我的日志语句打印消息对象的方式:
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 和 localId 变量在花括号之外,所以我不确定。
如何重组它以便我可以单独拥有每个单独的词典?
我从 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);
}
我知道
我会尝试进一步回答另一个问题,但这个问题显然是相关的。