首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用领域对数据进行排序

使用领域对数据进行排序
EN

Stack Overflow用户
提问于 2017-07-08 00:27:34
回答 1查看 354关注 0票数 0

我最近从Coredata搬到了领域。在我的应用程序中,我显示了50K +联系人。

联系人对象的格式如下:

联系人: firstName,lastName,公司

我正在尝试获取领域中的所有联系人,并试图显示类似于iPhone中的本机联系人应用程序的联系人。

首先,我将根据联系人名创建节标题:

代码语言:javascript
复制
-(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开头的所有联系人

代码语言:javascript
复制
-(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秒--这很好,但是我正在寻找方法来改进这个数据获取。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-11 00:19:33

领域的工作原理是延迟加载,其中对象及其属性直到第一次真正“触摸”它们时才被加载。

因此,如果您执行任何操作,手动迭代结果集中的所有领域对象,或者手动将特定对象复制到数组中,则会导致性能下降,从而增加在领域中持久化的对象数量。

最小化性能影响的最佳方法是尽量减少迭代结果集的次数,并尽可能避免将对象复制到数组中。RLMResults的行为类似于数组,因此在大多数情况下,您通常只需使用该对象即可。

prepareDataSource方法中,您可以考虑传递RLMResults对象本身,而不是循环遍历每个对象并将它们传递给该NSMutableArray

方法getSectionTitleBasedOn:看起来也很低效,因为您正在遍历每个对象,以检查具有特定第一个字符的条目是否存在。相反,您可以创建一个字母表索引,然后对以每个字母开头的条目执行一个领域查询,然后检查生成的RLMResults对象是否有一个正计数(但我不确定这是否会更快)。

但最终,有时当您这样做复杂的排序时,没有“聪明”的方法来避免迭代数据库中的每个对象(即使是在执行排序时,领域也必须在内部加载每个对象),性能命中是不可避免的,在这种情况下,您还应该确保UI有向用户显示“工作”指示符的规定。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44981336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档