开发技巧之高效的通信录排序

之前项目遇到过一个问题 要实现根据姓名的首字母进行分组排序类似于自带的电话簿差不多。

 姓名属性字典

@property (nonatomic, strong) NSMutableDictionary *nameDic;//姓名属性字典

字典大概是这个结构


字典结构

排序算法

#pragma mark 对数据进行排列按首字母进行分组

-(void)userSorting:(NSMutableArray *)modelArr{

    self.nameDic = [NSMutableDictionary dictionary];

    for ( modelAgreementCitizenItem *model in modelArr) {

        //获取汉子的首字母

        //把中文转拼音

        NSMutableString *ms = [[NSMutableString alloc] initWithString:[model patientName]];

        if (CFStringTransform((__bridge CFMutableStringRef)ms, 0, kCFStringTransformMandarinLatin, NO)) {

        }

        if (CFStringTransform((__bridge CFMutableStringRef)ms, 0, kCFStringTransformStripDiacritics, NO)) {

        }

        NSString *firstString = [[ms substringToIndex:1] uppercaseString];

        NSMutableArray * arr = [self.nameDic objectForKey:firstString];

        if (arr) {

            [arr addObject:model];

        }else{//如果没有 则需要创建一个添加到里面

            [self.nameDic setObject:[@[model] mutableCopy] forKey:firstString];

        }

    }

}

另外每个section都会显示首字母的大写 并按顺序排序

sortedArrayUsingSelector 这个方法是苹果自带的方法

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    if (!self.dataArr.count) {

        return 0;

    }

    //对数组中的字符串进行排序

    NSArray *keys = [self.nameDic.allKeys sortedArrayUsingSelector:@selector(compare:)];

    NSString *key = keys[section];

    NSArray *modelArr = self.nameDic[key];

    return modelArr.count;

}

多线程的操作

dispatch_group_t group = dispatch_group_create();

//某个任务放进 group

dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{

  [self userSorting:[self.dataArr mutableCopy]];

});

dispatch_group_notify(group, dispatch_get_main_queue(), ^{

  // 任务全部完成处理

  [self hideLoadingHUD];

  self.tableView.delegate = self;

  self.tableView.dataSource = self;

  [self.tableView reloadData];

});

 总结

大概主要代码是这些,但是筛选耗时比较久,尤其是数据量大的时候,从上一个界面跳转进入的时候就会出现延迟卡顿现象,此时可以利用多线程的方法把耗时任务放进子线程执行,还有一部分可以优化的是本地存储,我使用的是coredate存储,进入的时候拉取缓存,如果缓存没有才会去请求接口,当下拉刷新的时候就会去请求接口,更新数据库的数据。

你可能感兴趣的:(开发技巧之高效的通信录排序)