【发布时间】:2017-07-08 00:27:34
【问题描述】:
我最近从 Coredata 搬到了 Realm。在我的应用程序中,我显示了 50K + contacts 。
联系人对象的格式为:
联系人:名字、姓氏、公司
我正在尝试获取 Realm 中的所有联系人,并且我正在尝试显示这些联系人,类似于 iPhone 中的本机联系人应用程序。
首先,我根据联系人名字创建部分标题:
-(NSArray *)getSectionTitleBasedOn:(NSString*)sortBy{
RLMResults *results = [self getMainDataSetFromRealm];
ContactSource *contactSource = results.firstObject;
NSMutableDictionary *nameDic = [NSMutableDictionary dictionary];
for (RealmContact *contact in contactSource.contacts){
if (contact.firstName.length>0) {
if ([sortBy isEqualToString:@"FirstName"]) {
[nameDic setObject:@"firstletter" forKey:[contact.firstName substringToIndex:1]];
}
}
}
NSLog(@"dic %@",nameDic);
return [[nameDic allKeys]sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
}
这让我得到一个代表部分标题的字母数组。
现在我正在为每个部分准备数据源,因此对于 A 部分,我正在获取所有以字母“A”开头的联系人
-(void)prepareDataSource:(NSArray *)titleArr{
RLMResults *results = [self getMainDataSetFromRealm];
ContactSource *contactSource = results.firstObject;
__block NSMutableDictionary *dataSource = [NSMutableDictionary dictionary];
[titleArr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSString *sectionHeader = obj;
RLMResults *contactResults = [contactSource.contacts objectsWhere:[NSString stringWithFormat:@"firstName BEGINSWITH '%@'",sectionHeader]];
NSMutableArray *contactRowArr = [NSMutableArray array];
for (Contact *contact in contactResults){
[contactRowArr addObject:contact];
}
[dataSource setObject:contactRowArr forKey:sectionHeader];
}];
_dataSource = [dataSource copy];
[self.tableView reloadData];
}
这确实很好用,但加载表需要 3-5 秒,这很好,但我正在寻找改进此数据获取的方法。
【问题讨论】:
标签: ios objective-c realm contacts