私のアプリでは50k +の連絡先のデータベースを持っています。リストビューでそれらを表示するには、インデックスセクションタイトルを計算して右側に表示する必要があります。連絡先の名前に基づいてsectionIndexのタイトルを取得
私のロジックは、データソースを準備するのに3〜6秒ほどかかります。
-(NSArray *)getSectionTitleBasedOn:(NSString*)sortBy{
for (RealmContact *contact in contactSource){
if (contact.firstName.length>0) {
if ([sortBy isEqualToString:@"FirstName"]) {
NSString *firName= [contact.firstName stringByReplacingOccurrencesOfString:@" " withString:@""];
NSString *regex = @"^[A-Za-z]+";
NSPredicate *test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
BOOL result = [test evaluateWithObject:firName];
if (contact.firstName.length>0 && result)
{
[nameDic setObject:@"firstletter" forKey:[[contact.firstName substringToIndex:1]uppercaseString]];
}else{
[nameDic setObject:@"firstletter" forKey:@"#"];
}
}
if ([sortBy isEqualToString:@"LastName"]) {
//same
}
if ([sortBy isEqualToString:@"Company"]) {
//same
}
}
}
NSLog(@"dic %@",nameDic);
return [[nameDic allKeys]sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
}
これを改善するためにできることがあるかどうかは疑問です。
NSString *firName= [contact.firstName stringByReplacingOccurrencesOfString:@" " withString:@""];
NSString *regex = @"^[A-Za-z]+";
NSPredicate *test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
BOOL result = [test evaluateWithObject:firName];
文字列に特殊文字や無効な文字が含まれていないかどうかを確認するためにこれを行います。
私は配列を取得した後、私はそれを並べ替え、配列を返します。出力は次のようになります。
dic {
"#" = firstletter;
A = firstletter;
B = firstletter;
C = firstletter;
D = firstletter;
E = firstletter;
F = firstletter;
G = firstletter;
H = firstletter;
I = firstletter;
J = firstletter;
K = firstletter;
L = firstletter;
M = firstletter;
N = firstletter;
O = firstletter;
P = firstletter;
Q = firstletter;
R = firstletter;
S = firstletter;
T = firstletter;
U = firstletter;
V = firstletter;
W = firstletter;
X = firstletter;
Y = firstletter;
Z = firstletter;
}
場合の使用:https://pastebin.com/ixHsPSxh OSX Simulatorでテストしたところ、速くて(x10だがもっとテストはしなかった)。また、あなたのコードに小さなエラーがあります: '(contact.firstName.length> 0 && result)'と '[nameDic setObject:@" firstKey "forKey:[[contact.firstName substringToIndex:1] uppercaseString]]; 'contact.firstName'ではなく' firName'です。 – Larme