Pheepster
Pheepster

Reputation: 6357

Sorting an NSArray and case precedence

I have a list of managed objects stored in core data. I use these objects to populate a tableview controller that is sectioned according to alphabetical order. The data in these objects is obtained via web service, so I have no control over their case (which really doesn't make much difference in this case).

Most of the data is returned in all caps. I've noticed that, on the rare occasions where the case is NOT all caps, those items do not fall into alphabetic order. In the following code sample, stationIndex is an array of sorted first letters:

for(NSString *character in stationIndex){

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"name beginswith[c] %@", character];
    // sort the list
    NSArray *filteredGaugeList = [[tempGaugeList filteredArrayUsingPredicate:pred] sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
        NSString *first = [(Gauge*)a name];
        NSString *second = [(Gauge*)b name];
        return [first compare:second];
    }];
    if([filteredGaugeList count] > 0){
        [[self allGauges] addObject:filteredGaugeList];
    }
}

I'm aware that there is a way to ignore case when using a selector, but in my case, I'm sorting on properties of objects, so I'm assuming I need a comparator. Is there a way to handles case in this situation? Thanks!

Upvotes: 0

Views: 118

Answers (1)

Martin R
Martin R

Reputation: 539965

You can sort ignoring case in a comparator as well, just use

return [first caseInsensitiveCompare:second];

Alternatively, use a sort descriptor specifying the selector and the sort key:

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name"
                           ascending:YES
                            selector:@selector(caseInsensitiveCompare:)];
NSArray *sorted = [array sortedArrayUsingDescriptors:@[sort]];

Remark: To display Core Data objects in a table view, you can also use NSFetchedResultsController. Then you would add the predicate and the sort descriptor to the fetch request. A fetched results controller has also methods to group a table view into sections, and to update a table view automatically when objects are inserted/deleted/modified.

Upvotes: 2

Related Questions