NSSortDescriptor  是什么 ?

你可以将它看做是对一个排序规则的描述者  因为我们可以使用它来对我们数组中的对象进行排序操作

假设现在有这样一个需求: 数组里面有十个Person对象 每一个Person对象有自己的名字年龄和分数  我们需要对数组里面的这十个对象做排序操作 规则如下:

1.首先按照年龄排序

2.如果年龄相同按照分数排序

要实现这个需求 如果你之前 不知道NSSortDescriptor 这个对象 你可能会写很多的代码 现在借助这个对象我们会非常容易的实现上面的需求

下面是实例:

首先我们需要创建一个Person类: 包括姓名 年龄 分数三个属性  同时提供一个构造方法 用于快速创建一个Person对象 代码如下:

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property(nonatomic,strong)NSString *name;

@property(nonatomic,assign)NSInteger age;

@property(nonatomic,assign)float  score;

- (instancetype)initWithName:(NSString*)name age:(NSInteger)age score:(float)score;

@end
#import "Person.h"

@implementation Person

- (instancetype)initWithName:(NSString *)name age:(NSInteger)age score:(float)score
{
    if (self = [super init]) {

        self.name = name;
        self.age = age;
        self.score = score;

    }
    return self;
}

@end

接下来我们在 ViewController(ViewController继承自UITableviewController 并且程序的跟控制器是一个导航控制器)然后做如下的几件事情:

1. 创建十个Person对象 并且存入datas数组中

2.将数据用TableView展示

3.设置导航栏左边的按钮为排序 点击排序 可以按照我们设定的规则进行排序

创建十个Person对象 并且存入datas数组中 我们给ViewController 增加一个数组属性 datas 强引用着

@interface ViewController ()
@property(nonatomic,strong)NSMutableArray *datas;
@end

然后对datas采取懒加载的方式:

- (NSMutableArray *)datas
{
    if (!_datas) {

        _datas = [NSMutableArray array];

        Person *p1 = [[Person alloc] initWithName: score:];
        Person *p2 = [[Person alloc] initWithName: score:];
        Person *p3 = [[Person alloc] initWithName: score:];
        Person *p4 = [[Person alloc] initWithName: score:];
        Person *p5 = [[Person alloc] initWithName: score:];
        Person *p6 = [[Person alloc] initWithName: score:];
        Person *p7 = [[Person alloc] initWithName: score:];
        Person *p8 = [[Person alloc] initWithName: score:];
        Person *p9 = [[Person alloc] initWithName: score:];
        Person *p10 = [[Person alloc] initWithName: score:];

        [_datas addObject:p1];
        [_datas addObject:p2];
        [_datas addObject:p3];
        [_datas addObject:p4];
        [_datas addObject:p5];
        [_datas addObject:p6];
        [_datas addObject:p7];
        [_datas addObject:p8];
        [_datas addObject:p9];
        [_datas addObject:p10];

    }
    return _datas;
}

接下来我们先把这些数据展示出来 在ViewController里面写上如下代码:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return  self.datas.count;
}

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
        static NSString *ID = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ID];
    }

    Person *p = self.datas[indexPath.row];

    cell.textLabel.text = [NSString stringWithFormat:@"姓名:%@  年龄:%zd",p.name,p.age];
    cell.detailTextLabel.text =[NSString stringWithFormat:@"%f", p.score];

    return cell;
}

接下来我们可以运行一下看看界面效果:

接下来我们需要进行排序:

规则如下:

1.首先按照年龄排序

2.如果年龄相同按照分数排序

那么我们需要创建排序描述者,一个描述着只能对一个属性进行描述 如果需要描述多个 我们需要创建多个描述者

我们这里的需求就需要创建两个描述者  一个是对年龄描述 一个是对分数描述 代码如下:

NSSortDescriptor *ageSD = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];//ascending:YES 代表升序 如果为NO 代表降序
NSSortDescriptor *scoreSD=[NSSortDescriptor sortDescriptorWithKey:@"score" ascending:YES];

创建好这两个描述者之后 我们就可以调用数组的 sortedArrayUsingDescriptors 方法来实现排序

sortedArrayUsingDescriptors方法接收一个数组的参数 里面放描述者 然后他会返回一个排序好的数组 所以我们这样做:

self.datas = [[self.datas sortedArrayUsingDescriptors:@[ageSD,scoreSD]] mutableCopy];

我们点击导航栏左边的排序按钮的时候 会执行以下操作:

- (IBAction)sortAge:(id)sender {

    NSSortDescriptor *ageSD = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
    NSSortDescriptor *scoreSD=[NSSortDescriptor sortDescriptorWithKey:@"score" ascending:YES];

    self.datas = [[self.datas sortedArrayUsingDescriptors:@[ageSD,scoreSD]] mutableCopy];

    [self.tableView reloadData];

}

这个时候 我们再看下效果:

可以看到 如果年龄相同 我们就按照分数进行排序  这样我们的这个排序就完成了 如果你有多个排序需求 你就创建多个排序描述者就可以了 是不是很简单

NSSortDescriptor 的使用的更多相关文章

  1. OC中用NSSortDescriptor对象进行数组排序

    //创建一个数组 NSArray *array = @[@"one", @"two", @"three", @"four" ...

  2. NSSortDescriptor对象进行数组排序

    //创建一个数组 NSArray *array = @[@"zhangsan", @"lisi", @"zhonger", @"z ...

  3. OC-数组排序-NSSortDescriptor使用

    OC-数组排序-NSSortDescriptor使用 在Object-c中,当有一个班级类MyClass,还有一个学生类Student.在班级类MyClass中通过一个可变数组NSMutableArr ...

  4. 利用 NSSortDescriptor 对 NSMutableArray 排序

    有时我们在NSMutableArray中存的是网络请求返回的数据,而每一个元素又是一个NSDictionary,如果这时候需要把数组中的元素按照每个元素字典中某一个key来排序,那么我们可以利用Obj ...

  5. NSSortDescriptor(数组排序)

    如果数组里面的每一个元素都是一个个model,例如 DepartsDate.h文件 [plain] view plaincopy #import <Foundation/Foundation.h ...

  6. 【原】AFNetworking源码阅读(二)

    [原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...

  7. AFNetworking 3.0 源码解读(七)之 AFAutoPurgingImageCache

    这篇我们就要介绍AFAutoPurgingImageCache这个类了.这个类给了我们临时管理图片内存的能力. 前言 假如说我们要写一个通用的网络框架,除了必备的请求数据的方法外,必须提供一个下载器来 ...

  8. AFNetworking 3.0 源码解读(三)之 AFURLRequestSerialization

    这篇就讲到了跟请求相关的类了 关于AFNetworking 3.0 源码解读 的文章篇幅都会很长,因为不仅仅要把代码进行详细的的解释,还会大概讲解和代码相关的知识点. 上半篇: URI编码的知识 关于 ...

  9. iOS基本数据库存储方式 - CoreData

    CoreData 创建模型文件的过程 1.选择模板 2.添加实体 3.添加实体的属性[注意]属性的首字母必须小写 一.CoreData管理类(必备以下三个类对象) 1.CoreData数据操作的上下文 ...

随机推荐

  1. Both must set &quot;document.domain&quot; to the same value to allow access.

    有两个域名指向我的网站,其中一个域名访问我的网站的话就可以看到日期控件 另一个域名访问我的网站不能看到日期控件, 在EF中使用日期控件,浏览器审查元素后看到,报这个错误“Both must set & ...

  2. OS X 下不通过Homebrew安装ASP.NET 5开发环境

    在 ASP.NET 的 Home repo 里,推荐使用 Homebrew 安装开发环境,不过我的电脑里已经有 ports 了,这应该是当年用 rvm 安装 Ruby 时悄悄地装上的吧.不管怎样,作为 ...

  3. Android 开发项目笔记2 自建View满足特殊要求

    写java文件组成特殊的View,然后在xml文件中通过 包名.类名 调用. 1.padding 是指的组件内部的填充区域,不是指组件与parent之间的区域.操控后者间距后者使用margin 2.使 ...

  4. htm5l,第一个script代码练习

    <body>    <canvas id="mycanvas" width="500" height="300">  ...

  5. 基础14_转义字符和特殊字符ASCII

    一.摘要 PSQL转义字符 二.PLSQL转义字符 PLSQL对应的字符和序号关系 二.PLSQL特殊字符 PLSQL对应的字符和序号关系 1. 转义字符为' '; )||'%'; --A&B ...

  6. Gson---简单入门

    1-1.Diaosi.java(bean) package Bean; import com.google.gson.annotations.SerializedName; public class ...

  7. [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序

    本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...

  8. emoji和utf8mb4字符集

    mysql 的 utf8 不支持 emoji,需要修改设置为utf8mb4 <?php 'mysql' => [ 'charset' => 'utf8mb4', 'collation ...

  9. AC_Dream 1211 Reactor Cooling

    /* 题意:无源无汇,并且每条边的容量有上下界限的网络流问题!既然无源无汇,那么素有的节点都应该满足“入流==出流”! 输出每一条边的流量,使得满足上面的条件.(如果u->v有流量,那么v-&g ...

  10. [Bootstrap]7天深入Bootstrap(5)JavaScript插件

    在bs3.X中,提供了12种JavaScript插件,分别是:动画过渡(Transition).模态弹窗(Modal).下拉菜单(Dropdown).滚动侦测(Scrollspy).选项卡(Tab). ...