我有一个对象数组。数组中的对象包含一个字典作为其属性之一,我需要为数组中的每个对象搜索其中一个键的值。我需要使用类似的条件(我认为它实际上包含在objective-c中我可能是错的)。我使用方法_search_results = [_people filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"details[@\"firstName\"] contains %@",searchBar.text]];
,我认为将返回适合该搜索条件的所有对象。这是我的问题
1)我可以使用另一种方法吗?或者也许是一般的不同类?也许更有效的方法使用?
2)我是否正在字典中正确搜索值?由于它是对象的属性,我认为我做得对。我的语法看起来正确dictionaryName[keyName] contains value
我只使用NSPredicate与对象的属性,我从来没有必要搜索像这样的对象中的字典。就像我说的那样,我想我就在这里。
回应第一组答案
_search_results = [_people indexesOfObjectsPassingTest:^BOOL(PeopleObject *person, NSUInteger idx, BOOL * _Nonnull stop) {
NSString *last_name = person.details[kPersonLastNameKey];
if([last_name containsString:searchBar.text]){
return TRUE;
}
else
return FALSE;
}];
答案 0 :(得分:1)
至少有六种方法可以做到这一点。如果你使用的是Objective-C或Swift,你不会说,尽管你展示的示例代码看起来像Objective-C。
如果你使用的是Swift,你可以使用内置的Swift过滤功能,但让我们放弃。
您现在可以使用filteredArrayUsingPredicate
。
您可以使用indexesOfObjectsPassingTest
在数组中构建满足条件的NSIndexSet
个对象(该方法接受一个块,对于块返回true的所有对象,生成的索引集)包括对象的索引。然后,您使用objectsAtIndexes
返回索引集中列出的对象数组。
我还没有对它进行基准测试,但我怀疑对于大型数组,谓词方法较慢,因为谓词是一种非常灵活的选择对象的方法,而灵活的代码往往是较慢的代码。但是,除非您要过滤数万个或更多对象,否则我怀疑您是否注意到性能上的差异。
不要陷入premature optimization的陷阱 - 浪费你的时间,让你的代码更复杂,以优化对你的应用程序性能没有任何有意义影响的事情。
除非您的应用运行速度明显缓慢,并且您已对其进行测试并确定阵列过滤对此缓慢有重大影响,否则可能不值得担心。