Automate This
Automate This

Reputation: 31364

Sort NSArray of custom objects by inherited property when adding new object

Class "Person" is inherited by "Employee" which is inherited by "EmployeeList"

In my main model I initialize a new Employee object, setting the firstName and lastName, and then addEmployee to an EmployeeList.

Inside the addEmployee method I want to sort the NSArray of Employee objects by lastName

Here is what I've tried but it's not sorting the list.

#import "EmployeeList.h"

@interface EmployeeList()
@property (strong, nonatomic) NSMutableArray *employees;  // of Employee
@end


@implementation EmployeeList

- (NSMutableArray *)employees
{
    if (!_employees) _employees = [[NSMutableArray alloc] init];
    return _employees;
}

- (void)addEmployee:(Employee *)employee
{
    [self.employees addObject:employee];

    NSSortDescriptor *sortDescriptor =
    [NSSortDescriptor sortDescriptorWithKey:@"lastName"
                                  ascending:YES
                                   selector:@selector(caseInsensitiveCompare:)];
    [self.employees sortedArrayUsingDescriptors:@[sortDescriptor]];

    _numberEmployees++;
}

Main model:

EmployeeList *mgrList = [[EmployeeList alloc] init];

Employee *employee = [[Employee alloc] init];
employee.firstName = object[@"firstName"];
employee.lastName  = object[@"lastName"];
employee.phoneNumber = object[@"phoneNumber"];

[mgrList addEmployee:employee];

Upvotes: 0

Views: 187

Answers (2)

rmaddy
rmaddy

Reputation: 318854

Change this:

[self.employees sortedArrayUsingDescriptors:@[sortDescriptor]];

to:

[self.employees sortUsingDescriptors:@[sortDescriptor]];

Upvotes: 2

Matteo Gobbi
Matteo Gobbi

Reputation: 17707

Ok your code need a refactor:

#import "EmployeeList.h"

@interface EmployeeList()
@property (strong, nonatomic) NSMutableArray *employees;  // of Employee
@end


@implementation EmployeeList

//This is a more elegant solution to init
- (NSMutableArray *)employees
{
    dispatch_token_t token;
    dispatch_once(&token, ^{
        _employees = [NSMutableArray new];
    });
    return _employees;
}

- (void)addEmployee:(Employee *)employee
{
    [self.employees addObject:employee];

    NSSortDescriptor *sortDescriptor =
    [NSSortDescriptor sortDescriptorWithKey:@"lastName"
                                  ascending:YES
                                   selector:@selector(caseInsensitiveCompare:)];

    //This return an array so if you don't take it you don't have any change.
    NSArray *newArray = [[self.employees copy] sortedArrayUsingDescriptors:@[sortDescriptor]];

    //Then you can remove and add again all the object to the NSMutableArray
    [self.employees removeAllObjects];
    [self.employees addObjectsFromArray:newArray];

    //This is not needed because you can access to this information by
    //[self.employees count]
    //_numberEmployees++;
}

Be careful because you self.employees is mutable.

Upvotes: 1

Related Questions