2015-7-1日
在项目中当用户点击时需要对汉字和日期进行排序,是从服务器获取下来的数据,外层是数组包含字典,需要对字典里边的值进行排序。具体实现代码如下
在对汉字排序的时候也有采取取出汉字的首字母,将汉字转变为拼音,然后取出首字母,代码如下:
- (NSString *)firstCharactor:(NSString *)aString
{
//转成了可变字符串
NSMutableString *str = [NSMutableString stringWithString:aString];
//先转换为带声调的拼音
CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);
//再转换为不带声调的拼音
CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformStripDiacritics,NO);
//转化为大写拼音
NSString *pinYin = [str capitalizedString];
//获取并返回首字母
return [pinYin substringToIndex:1];
}
/**
* @method 排序(汉语拼音排序)
* @params order 依照对象的哪个特性进行排序 传入需要排序key string name
* @reult void
*/
- (void)sortByOrder:(NSComparisonResult )order withName:(NSString *)name {
/*降序和升序的话,就让无值或者乱值的当前数据处于最后(就是最小 defaultMinString)
*/
NSString *defaultMinString = @"a";
NSString *defaultMaxString = @"z";
switch (order) {
case NSOrderedAscending: //升序a<b``
[self sortByString:NSOrderedAscending withDefaultName:defaultMinString andString:name];
break;
case NSOrderedDescending: //降序a>b
[self sortByString:NSOrderedDescending withDefaultName:defaultMaxString andString:name];
break;
default:
break;
}
}
- (void)sortByString:(NSComparisonResult )order withDefaultName:(NSString *)defaultName andString:(NSString *)nameString {
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globalQueue, ^{
[tableListArr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSString *string1;
if ([[obj1 valueForKey:nameString] isEqual:[NSNull null]]) {
string1 = defaultName;
}else {
string1 = [obj1 valueForKey:nameString];
}
NSString *string2;
if ([[obj2 valueForKey:nameString] isEqual:[NSNull null]]) {
string2 = defaultName;
}else {
string2 = [obj2 valueForKey:nameString];
}
NSComparisonResult result = [string1 localizedCompare:string2];
return result == order;
}];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
});
}