之前项目遇到过一个问题 要实现根据姓名的首字母进行分组排序类似于自带的电话簿差不多。
姓名属性字典
@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存储,进入的时候拉取缓存,如果缓存没有才会去请求接口,当下拉刷新的时候就会去请求接口,更新数据库的数据。
网友评论