Я знаю, что уже задано много вопросов, однако я задаю еще один вопрос, чтобы поймать. У меня есть массив, огромное количество (тысячи записей) данных в формате 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
Я пробовал это, используя эти способы,
Использование предикатов NSP
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
, я выполнил операцию поиска в фоновом потоке, да, теперь его пользовательский интерфейс не заблокирован, но поиск все еще слишком медленный. Что я делаю, так это выполняю селектор с некоторой задержкой, скажем, 0,25 секунд, также отменяя все предыдущие вызовы селектора, а затем выполняя поиск в фоновом режиме, а также перезагружая таблицу в основном потоке. Это работает так: если я набираю символ с некоторой задержкой, он работает хорошо, но если я набираю целое слово сразу, он загружает/обновляет таблицу в соответствии с нажатыми символами, наконец, он покажет мне фактический вывод, занимает 3- 4 секунды для показа фактического содержания.
Любое предложение или помощь высоко ценится!