现在的位置: 首页 > 综合 > 正文

iOS开发-Objc数据排序,使用block实现

2018年04月08日 ⁄ 综合 ⁄ 共 5091字 ⁄ 字号 评论关闭

对于在app中开发,网络数据的排序,大致的思路有两种:

1.客户端每次发出新的请求,服务器在数据库排好序然后直接给客户端一个排好序的数组即可

2.为了减少请求的次数和服务器的压力排序的事可以交给客户端来做,目前的智能机的硬件能胜任这个事情

下面提供一个可以直接使用的,按照一个model或者实体 类Entity的一个属性(property)组成的一个数组进行升序和降序排序的方法,可以直接使用

/*
 静态方法:sortByValue
 功能:对model/Entity数组按model的属性进行升序或者降序排序
 ifIncrease:是否未升序,YES升序,NO降序
 sortProperty:需要的model的属性用来排序,例如一个Student对象的Grade成绩来排序
 返回值:一个新的数组,当你得到这个排序的数组之后,只需要  self.tableView reloadData即可
 说明:每一个参数都为必填,使用自定义的block来实现排序的规则
 
 */
+ (NSArray *)sortByValue:(NSArray *)array ifIncrease:(BOOL)inc sortProperty:(NSString *)property
{
    
  return   [array sortedArrayUsingComparator:^NSComparisonResult(NSObject *obj1, NSObject* obj2)
    {
        int  a=[[obj1 valueForKey:property] intValue];
        int  b=[[obj2 valueForKey:property] intValue];
        if (inc)//升序
        {
            if (a<b) return -1;//NSComparisonResult枚举中对应的值,代表升序(a-b<0)

                else return 1;//(a-b>0)降序
            
        }
        
        else//降序
        {
            if (a<b) return 1;
                else return -1;
            
        }
    }];
}

测试Demo:

一个Model类,例如一个人,有工资salary,和grade分数,idNum工号

一个Utils类,封装的静态方法,便于以后的多次调用

ViewController类,系统创建


代码如下:

// 实体类/Model类有若干属性
//  Model.h
//  SortByValue
//
//  Created by  on 15/1/16.
//  Copyright (c) 2015年 . All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Model : NSObject
@property(strong,nonatomic)NSString *grade;//成绩
@property(strong,nonatomic)NSString *salary;//工资
@property(strong,nonatomic)NSString *idNum;//工号
- (instancetype)initWithAll:(NSString *)grade andSalary:(NSString *)salary andIdNum:(NSString *)idNum;
@end
//
//  Model.m
//  SortByValue
//
//  Created by  on 15/1/16.
//  Copyright (c) 2015年 . All rights reserved.
//

#import "Model.h"

@implementation Model
//实现自己的初始化方法
- (instancetype)initWithAll:(NSString *)grade andSalary:(NSString *)salary andIdNum:(NSString *)idNum
{
    self = [super init];
    if (self)
    {
        _grade=grade;
        _salary=salary;
        _idNum=idNum;
    }
    return self;
}
- (NSString *)description  //类似于java的toString发,打印这个Model对象即会调用这个方法
{
    NSString *str=[NSString stringWithFormat:@"grade=%@,salary=%@,idNum=%@",_grade,_salary,_idNum];
    NSLog(@"grade=%@,salary=%@,idNum=%@",_grade,_salary,_idNum);
    return str;
}
@end

//工具类,经常需要被调用
//  Utils.h
//  SortByValue
//
//  Created by yb on 15/1/17.
//  Copyright (c) 2015年 . All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Utils : NSObject
+ (NSArray *)sortByValue:(NSArray *)array ifIncrease:(BOOL)inc sortProperty:(NSString *)property;
@end

//工具类的实现
//  Utils.m
//  SortByValue
//
//  Created by  on 15/1/17.
//  Copyright (c) 2015年 . All rights reserved.
//

#import "Utils.h"

@implementation Utils
/*
 静态方法:sortByValue
 功能:对model数组按model的属性进行升序或者降序排序
 ifIncrease:是否未升序,YES升序,NO降序
 sortProperty:需要的model的属性用来排序
 说明:每一个参数都为必填
 */
+ (NSArray *)sortByValue:(NSArray *)array ifIncrease:(BOOL)inc sortProperty:(NSString *)property
{
    
    return   [array sortedArrayUsingComparator:^NSComparisonResult(NSObject *obj1, NSObject* obj2)
              {
                  int  a=[[obj1 valueForKey:property] intValue];
                  int  b=[[obj2 valueForKey:property] intValue];
                  if (inc)
                  {
                      if (a<b) return -1;
                      else return 1;
                      
                  }
                  
                  else
                  {
                      if (a<b) return 1;
                      else return -1;
                      
                  }
              }];
}

@end
//测试类,系统创建,.h
//  ViewController.m
//  SortByValue
//
//  Created by on 15/1/16.
//  Copyright (c) 2015年 . All rights reserved.
//

#import "ViewController.h"
#import "Model.h"
#import "Utils.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    NSMutableArray *arr=[[NSMutableArray alloc]initWithCapacity:10];
    Model *model1=[[Model alloc]initWithAll:@"100" andSalary:@"10000" andIdNum:@"1111"];
    Model *model2=[[Model alloc]initWithAll:@"99" andSalary:@"20000" andIdNum:@"3111"];
    Model *model3=[[Model alloc]initWithAll:@"101" andSalary:@"10000" andIdNum:@"1110"];
    Model *model4=[[Model alloc]initWithAll:@"77" andSalary:@"40000" andIdNum:@"1101"];
    [arr addObject:model1];
    [arr addObject:model2];
    [arr addObject:model3];
    [arr addObject:model4];

    
    NSLog(@"排序之前的顺序是:");
    for (Model*model in arr)
    {
        NSLog(@"%@",model);
    }
    
    NSArray *arr1=[Utils sortByValue:arr ifIncrease:NO sortProperty:@"salary"];
    NSLog(@"<span style="font-family: Arial, Helvetica, sans-serif;">salary</span>排序之后的顺序是:");
    for (Model*model in arr1)
    {
        NSLog(@"%@",model);
    }

    
}


@end

运行效果:

2015-01-17 11:44:35.428 SortByValue[24580:1627720] 排序之前的顺序是:
2015-01-17 11:44:35.428 SortByValue[24580:1627720] grade=100,salary=10000,idNum=1111
2015-01-17 11:44:35.428 SortByValue[24580:1627720] grade=100,salary=10000,idNum=1111
2015-01-17 11:44:35.429 SortByValue[24580:1627720] grade=99,salary=20000,idNum=3111
2015-01-17 11:44:35.429 SortByValue[24580:1627720] grade=99,salary=20000,idNum=3111
2015-01-17 11:44:35.429 SortByValue[24580:1627720] grade=101,salary=10000,idNum=1110
2015-01-17 11:44:35.429 SortByValue[24580:1627720] grade=101,salary=10000,idNum=1110
2015-01-17 11:44:35.429 SortByValue[24580:1627720] grade=77,salary=40000,idNum=1101
2015-01-17 11:44:35.429 SortByValue[24580:1627720] grade=77,salary=40000,idNum=1101
2015-01-17 11:44:35.429 SortByValue[24580:1627720] 排序之后的顺序是:
2015-01-17 11:44:35.429 SortByValue[24580:1627720] grade=77,salary=40000,idNum=1101
2015-01-17 11:44:35.430 SortByValue[24580:1627720] grade=77,salary=40000,idNum=1101
2015-01-17 11:44:35.430 SortByValue[24580:1627720] grade=99,salary=20000,idNum=3111
2015-01-17 11:44:35.430 SortByValue[24580:1627720] grade=99,salary=20000,idNum=3111
2015-01-17 11:44:35.430 SortByValue[24580:1627720] grade=100,salary=10000,idNum=1111
2015-01-17 11:44:35.430 SortByValue[24580:1627720] grade=100,salary=10000,idNum=1111
2015-01-17 11:44:35.517 SortByValue[24580:1627720] grade=101,salary=10000,idNum=1110
2015-01-17 11:44:35.517 SortByValue[24580:1627720] grade=101,salary=10000,idNum=1110


抱歉!评论已关闭.