NSSortDescriptor
следует инициализировать ключевой строкой для свойства объекта, а не строкой запроса.Это означает, что вы должны реализовать формулу расстояния как метод вашего объекта.
После этого не имеет значения, выполняете ли вы сортировку до или после извлечения:
NSArray *result = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
result = [result sortedArrayUsingSelector:@"compareDistance"];
Еще,Ваша формула расстояния не работает правильно, как лат.и долго.не иметь такого же масштаба, если вы не на экваторе.Используйте это:
double latDiff = lat1-lat2;
double longDiff = (long1-long2)*cos(lat1); //cos() assumes lat1 is in radians
double distance = sqrt(latDiff*latDiff+longDiff*longDiff);
Если расстояние превышает несколько сотен километров, вам нужен Закон сферических косинусов :
// assuming angles in radian,
double separation = acos( sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2)*cos(long1-long2) );
double distance = separation*earthRadius;