美文网首页
开发技巧之高效的通信录排序

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

作者: Sharb | 来源:发表于2018-09-04 14:48 被阅读6次

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

     姓名属性字典

    @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存储,进入的时候拉取缓存,如果缓存没有才会去请求接口,当下拉刷新的时候就会去请求接口,更新数据库的数据。

    相关文章

      网友评论

          本文标题:开发技巧之高效的通信录排序

          本文链接:https://www.haomeiwen.com/subject/ejbgwftx.html