すでに多くの質問が寄せられていることは承知していますが、キャッチするためにもう 1 つ質問を投げかけています。配列には膨大な量 (数千のレコード) のデータが含まれて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 を返す場合
これらの方法で試してみましたが、
NSPredicate の使用
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 秒。
どんな提案や助けも大歓迎です!