gpt4 book ai didi

iphone - 搜索 NSArray 包含 NSDictionary,值为 "time efficiency"

转载 作者:行者123 更新时间:2023-12-03 19:41:29 24 4
gpt4 key购买 nike

我知道已经有很多问题被问到,但是我还要再提出一个问题来解决。我有一个数组包含大量(数千条记录)NSDictionary 格式的数据,我试图在字典中的键内执行搜索到数组中。

我正在 UITextField 中执行搜索 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
数据源方法,

我的搜索要求是在整个字符串内,

示例字符串,

aaa, abeb, abcd, abbec like strings

搜索流程,

如果 a 返回所有字符串,

如果aa仅返回aaa,

如果ab返回abeb、abcd、abbec,例如,

重要的是,如果它的 cd 则仅返回 abcd

我已经尝试过使用这些方法,

使用NSPredicates

NSLog(@"start search at : %@",[NSDate date]);
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Name contains[cd] %@", matchString];
searchArray = [[meadArray filteredArrayUsingPredicate:predicate] mutableCopy];
NSLog(@"Search found count = %d",searchArray.count);
[tableCheck reloadData];
NSLog(@"End search at : %@",[NSDate date]);

另一种方式 - 通过迭代

NSLog(@"start search at : %@",[NSDate date]);
for (NSDictionary *word in arrayNames)
{
if ([matchString length] == 0)
{
[searchArray addObject:word];
continue;
}
NSRange lastRange = [[[word valueForKey:@"Name"] uppercaseString] rangeOfString:upString];

if ( lastRange.location != NSNotFound)
{
if(range.location == 0 || lastRange.location == 0)
{
[searchArray addObject:word];
}
}
}
NSLog(@"End search at : %@",[NSDate date]);

这两种方法都工作正常,结果符合我的预期,但仅限于模拟器!当我在设备中测试相同的内容时,根据搜索扩展,大约需要 1/2/3 秒,比如说,首先如果我输入 a ,则需要 3 秒,对于 aa 花费了大约 2 秒,依此类推。 它在设备上看起来很笨拙,任何按下的键都将保持突出显示状态,直到搜索未完成

有没有什么办法,我可以使用我正在使用的相同方法或任何其他替代方法来执行更快的搜索!

更新1

还尝试使用 CFArrayBSearchValues 它只返回搜索字符串的索引,但我想要返回所有匹配字符串的东西。

unsigned index = (unsigned)CFArrayBSearchValues((CFArrayRef)meadArray, CFRangeMake(0, CFArrayGetCount((CFArrayRef)meadArray)), (CFStringRef)matchString,(CFComparatorFunction)CFStringCompare, NULL);

更新2

根据Alladinian评论,我在后台线程中执行搜索操作,是的,现在它不锁定UI,但搜索仍然太慢,我在做什么就是,执行选择器一段延迟(例如 0.25 秒),同时取消任何先前的选择器调用,然后在后台执行搜索,还在主线程中重新加载表。它的工作原理是,如果我输入一些延迟的字符,它的效果很好,但是如果我一次输入整个单词,它会根据按下的字符加载/更新表格,最后它会向我显示实际的输出,需要 3- 4秒显示实际内容。

非常感谢任何建议或帮助!

最佳答案

您的搜索速度比需要的速度要慢。 searchString.length 不应在循环中检查,而应在外部完成。 valueForKey:是一个非常通用的方法,允许您访问任何类型的不同关键路径 - objectForKey 速度要快得多!接下来,您对区分大小写的匹配的检查始终将整个单词翻译为大写。一旦用户输入一些更有趣的搜索字符串,这不仅是不正确的,而且速度很慢并且占用大量内存(如果有数千个字符串,您将创建数千个自动释放的对象)。使用 rangeOfString:options: 代替。

最后,您可以尝试 NSArray 方法 enumerateObjectsUsingBlock: 或 enumerateObjectsWithOptions:usingBlock: ,它允许在多个线程上进行枚举。

indexesOfObjectsPassingTest: 或indexesOfObjectsWithOptions:passingTest: 获取要查找的元素的索引,这样会更快。如果您再次搜索较长的字符串,例如在搜索 ab 之后搜索 abc,这尤其有用,因为有 NSArray 方法将搜索限制为索引集。

关于iphone - 搜索 NSArray 包含 NSDictionary,值为 "time efficiency",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15269691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com