我有这样的词典
NSDictionary *dictA = @{ @"name" : @"John",
@"city" : @"Los Angeles" };
NSDictionary *dictB = @{ @"name" : @"Bob",
@"city" : @"Los Angeles" };
NSDictionary *dictC = @{ @"name" : @"Carl",
@"city" : @"Dallas" };
像这样的许多词典被城市分开并放入其他词典中,如
NSArray *losAngeles = @[ dictA, dictB, ....];
NSArray *dallas = @[ dictC, ... ];
并且所有内容都在数组
中self.arrayAll = @[losAngeles, dallas, miami... ];
现在更好的部分,我想得到一个包含名为Bob的人的字典(假设所有名称都是唯一的)。
如果那是一系列的dicts我会这样做
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name BEGINSWITH[cd] %@)", @"Bob"];
NSarray *filteredNames = [self.arrayAll filteredArrayUsingPredicate:pred];
但是因为arrayAll是一个dicts数组的数组,所以这不适用于以下错误:
***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'无法使用非字符串的内容执行子字符串操作????
任何线索?
答案 0 :(得分:1)
为什么不进行快速枚举? 类似的东西:
for (NSArray *cityArray in self.arrayAll) {
for (NSDictionary *cityDictionary in cityArray) {
if ([[cityDictionary valueForKey:@"name"] isEqualToString:@"Bob"]) {
//do something
}
}
}
答案 1 :(得分:1)
我做这样的事情......
NSMutableArray *results = [NSMutableArray array];
[citiesArray enumerateObjectsUsingBlock:^(NSArray *dictArray, NSUInteger idx, BOOL *stop) {
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name BEGINSWITH[cd] %@)", @"Bob"];
NSArray *filteredNames = [self.arrayAll filteredArrayUsingPredicate:pred];
[results addObjectsFromArray:filteredNames];
}];
您可以像这样添加并发选项......
[citiesArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSArray *dictArray, NSUInteger idx, BOOL *stop) {
//stuff...
}];
让它同时运行。我不知道结果数组如何处理它。试一试。
这将利用所有步骤的快速枚举和并发。