Question: I have an `NSArray` of `NSDictionaries`. In the `NSDictionary` I have an element called 'rowID' which is saved as an `NSString`. However, everything saved in it is a number even though they saved as a string.

I would like to know how to sort the array based on this value but in terms of sorting 1-100. Currently, when I sort it 10 comes first when it should be 1-10.

This is how I am sorting:

```
NSArray *tempSortedItemsArray = [itemArray sortedArrayUsingDescriptors:
                                     @[[NSSortDescriptor
                                        sortDescriptorWithKey:@"rowID" ascending:YES]]];

```

Answer: 
You can get numeric sorting by following this code:-

```
NSMutableArray *tmpAr = [[NSMutableArray alloc] init];

NSMutableDictionary *tmpDict = [[NSMutableDictionary alloc] init];
[tmpDict setObject:@"name" forKey:@"number5"];
[tmpDict setObject:@"5" forKey:@"id"];
[tmpAr addObject:tmpDict];

tmpDict = [[NSMutableDictionary alloc] init];
[tmpDict setObject:@"name" forKey:@"number3"];
[tmpDict setObject:@"3" forKey:@"id"];
[tmpAr addObject:tmpDict];

tmpDict = [[NSMutableDictionary alloc] init];
[tmpDict setObject:@"name" forKey:@"number2"];
[tmpDict setObject:@"2" forKey:@"id"];
[tmpAr addObject:tmpDict];

tmpDict = [[NSMutableDictionary alloc] init];
[tmpDict setObject:@"name" forKey:@"number1"];
[tmpDict setObject:@"1" forKey:@"id"];
[tmpAr addObject:tmpDict];

tmpDict = [[NSMutableDictionary alloc] init];
[tmpDict setObject:@"name" forKey:@"number4"];
[tmpDict setObject:@"4" forKey:@"id"];
[tmpAr addObject:tmpDict];

tmpDict = [[NSMutableDictionary alloc] init];
[tmpDict setObject:@"name" forKey:@"number25"];
[tmpDict setObject:@"25" forKey:@"id"];
[tmpAr addObject:tmpDict];

tmpDict = [[NSMutableDictionary alloc] init];
[tmpDict setObject:@"name" forKey:@"number10"];
[tmpDict setObject:@"10" forKey:@"id"];
[tmpAr addObject:tmpDict];

tmpDict = [[NSMutableDictionary alloc] init];
[tmpDict setObject:@"name" forKey:@"number7"];
[tmpDict setObject:@"7" forKey:@"id"];
[tmpAr addObject:tmpDict];

NSLog(@"tmpar1 = %@",tmpAr);

[tmpAr sortUsingComparator:
 ^(id obj1, id obj2)
 {
     NSInteger value1 = [[obj1 objectForKey: @"id"] intValue];
     NSInteger value2 = [[obj2 objectForKey: @"id"] intValue];
     if (value1 > value2)
     {
         return (NSComparisonResult)NSOrderedDescending;
     }

     if (value1 < value2)
     {
         return (NSComparisonResult)NSOrderedAscending;
     }
     return (NSComparisonResult)NSOrderedSame;
 }];

NSLog(@"tmpar2 = %@",tmpAr);

```
If you create your sort descriptor with `initWithKey:ascending:selector:` or `sortDescriptorWithKey:ascending:comparator:` you can specify a selector used to compare objects.

Now the problem is which selector to pass. Well, you can create a Category on NSString implementing a custom sort function that sorts based on the numeric value of the string. Remember that from the documents:

> 
> The selector must specify a method implemented by the value of the
>  property identified by keyPath. The selector used for the comparison
>  is passed a single parameter, the object to compare against self, and
>  must return the appropriate NSComparisonResult constant. The selector
>  must have the same method signature as:
> 
> 
> 

```
- (NSComparisonResult)localizedCompare:(NSString *)aString

```

> 
> The object at the specified property key, relative to each object in
>  the collection, must implement the compare selector used to create the
>  sort descriptor. If no custom selector was specified, the objects must
>  implement compare.
> 
> 
>