【发布时间】:2013-03-07 11:14:12
【问题描述】:
我知道已经有很多问题被问到了,但是我还要再提出一个问题。我有一个数组包含大量(数千条记录)NSDictionary 格式的数据,我正在尝试在字典中的键中执行搜索到数组中。
我在UITextField- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
数据源方法中进行搜索,
我的搜索要求是在整个字符串中,
示例字符串,
aaa, abeb, abcd, abbec 类字符串
搜索流程,
如果 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 秒,所以在。 IT LOOKS CLUMSY ON DEVICE, ANY PRESSED KEY WILL BE REMAIN HIGHLIGHTED UNTIL SEARCH NOT DONE.
有什么方法可以让我使用我正在使用的相同方法或任何其他替代方法来执行更快的搜索!
更新 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 秒。
非常感谢任何建议或帮助!
【问题讨论】:
标签: iphone nsarray nsdictionary nspredicate cfarraybsearchvalues