Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用领域对数据进行排序_Ios_Objective C_Realm_Contacts - Fatal编程技术网

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

Ios 使用领域对数据进行排序,ios,objective-c,realm,contacts,Ios,Objective C,Realm,Contacts,我最近从Coredata转到了Realm。在我的应用程序中,我显示了超过50K个联系人 联系人对象的格式为: 联系人:姓、名、公司 我正在尝试获取域中的所有联系人,并尝试显示与iPhone中的本机联系人应用程序类似的联系人 首先,我将根据联系人的名字创建部分标题: -(NSArray *)getSectionTitleBasedOn:(NSString*)sortBy{ RLMResults *results = [self getMainDataSetFromRealm];

我最近从Coredata转到了Realm。在我的应用程序中,我显示了超过50K个联系人

联系人对象的格式为:

联系人:姓、名、公司

我正在尝试获取域中的所有联系人,并尝试显示与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秒,这很好,但我正在寻找改进此数据获取的方法

Realm的工作原理是延迟加载,对象及其属性只有在您第一次真正“触摸”它们时才会加载

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

将性能影响降至最低的最佳方法是尝试并减少迭代结果集的次数,并尽可能避免将对象复制到数组之外
RLMResults
的行为类似于数组,因此在大多数情况下,您通常可以使用该对象

在<代码> PrimeDealSoCurs方法中,而不是循环遍历每个对象并将它们传递给该<代码> NSMutableArray < /C> >,而不是考虑传递<<代码> RLMRESUMENT/<代码>对象本身。 方法

getSectionTitleBasedOn:
也似乎效率很低,因为您正在迭代每个对象,以检查是否存在具有特定第一个字符的条目。相反,您可以创建字母表的索引,然后对以每个字母开头的条目执行领域查询,然后检查结果
RLMResults
对象是否有正计数(尽管我不确定这是否会更快)


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

领域的工作原理是延迟加载,在您第一次实际“触摸”对象及其属性之前,不会加载对象及其属性

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

将性能影响降至最低的最佳方法是尝试并减少迭代结果集的次数,并尽可能避免将对象复制到数组之外
RLMResults
的行为类似于数组,因此在大多数情况下,您通常可以使用该对象

在<代码> PrimeDealSoCurs方法中,而不是循环遍历每个对象并将它们传递给该<代码> NSMutableArray < /C> >,而不是考虑传递<<代码> RLMRESUMENT/<代码>对象本身。 方法

getSectionTitleBasedOn:
也似乎效率很低,因为您正在迭代每个对象,以检查是否存在具有特定第一个字符的条目。相反,您可以创建字母表的索引,然后对以每个字母开头的条目执行领域查询,然后检查结果
RLMResults
对象是否有正计数(尽管我不确定这是否会更快)

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