【发布时间】:2017-08-14 13:38:20
【问题描述】:
在我的应用程序中,我有一个拥有 50k+ 联系人的数据库。要在列表视图中显示它们,我需要计算索引部分标题以将它们显示在右侧。
但是,我的逻辑需要大约 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;
}
【问题讨论】:
-
我这样做了:pastebin.com/ixHsPSxh 在 OSX 模拟器上测试,似乎更快(x10,但没有做更多测试)。此外,代码中的小错误:
if (contact.firstName.length>0 && result)和[nameDic setObject:@"firstletter" forKey:[[contact.firstName substringToIndex:1]uppercaseString]];应使用firName而不是contact.firstName。
标签: ios nsarray nsdictionary nspredicate