2016-02-03 5 views
1

У меня есть приложение iOS, которое загружает некоторые данные с сервера. Данные включают в себя три основных сегмента: имя (строка), адрес (строка) и расстояние (поплавок).Сортировка нескольких NSArray в одно и то же время - iOS

Указанные данные хранятся в трех простых NSArray. Однако я хотел бы отсортировать данные, чтобы результаты были показаны в следующем формате: Наименьшее расстояние сначала -> максимальное расстояние.

Я использую метод Apple sortedArrayUsingComparator для сортировки расстояния. Однако у меня есть одна проблема ... как я могу выполнять те же действия сортировки на двух других NSArray, чтобы данные отображались правильно?

Это то, что я пытался до сих пор:

NSArray *nameData = // string data..... 
NSArray *addressData = // string data..... 
NSArray *distanceData = // float data..... 

distanceData = [distanceData sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 

    if ([obj1 floatValue] > [obj2 floatValue]) { 
     return NSOrderedDescending; 
    } 

    else if ([obj1 floatValue] < [obj2 floatValue]) { 
     return NSOrderedAscending; 
    } 

    return NSOrderedSame; 
}]; 

Как вы можете видеть, приведенный выше код будет сортировать «distanceData» массив и тот большой, но если я только сортировать массив расстояние, то другие два массива не будут в правильном порядке. Итак, как я могу отсортировать два других массива?

Спасибо за ваше время, Дэн.

+0

Вы пробовали объект класса? –

+0

В соответствии с моим пониманием вашего вопроса вы можете создать 3 разных NSThread для сортировки NSArray параллельно. – nikhil84

ответ

1

Сделать один класс с именем Person типа NSObject со свойствами name, address, distance

Person.h

@interface Person : NSObject 

@property (strong, nonatomic) NSString *name; 
@property (strong, nonatomic) NSString *address; 
@property (assign, nonatomic) float distance; 

@end 

Person.m

@implementation Person 

@synthesize name; 
@synthesize address; 
@synthesize distance; 

@end 

В контроллере представления, принимать только 1 массив с объектом класса Person вместо 3 массивов.

arrPersons = //...Person objects; 

Здесь вы получите все значения. Для примера.

Person *p = [arrPersons objectAtIndex:0]; 
//p.name 
//p.address 
//p.distance 

Таким образом, у вас есть несколько значений объекта Person. Основываясь на свойстве с именем distance, вы можете выполнить сортировку.
Итак, вы получите обновленные объекты Person. В этих объектах все значения будут отсортированы.

NSArray *sortedArray; 
sortedArray = [arrPersons sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
    float first = [(Person*)a distance]; 
    float second = [(Person*)b distance]; 
    return first > second; //Here, you can use > or < as per ASC or DESC 
}]; 

Надеюсь, вы получите представление. Также это удовлетворит ваши потребности.
Спасибо.

+0

Как именно вы добавляете к этому объекты? Есть ли метод '' addObject''', как есть '' 'NSMutableArray'''? Кроме того, я просто подумал: почему бы не создать массив массивов, например: '' '@ [@ [имя, адрес, расстояние], [@ [имя, адрес, расстояние] и т. Д.]' '' ?? – Supertecnoboff

+0

Хорошо, немного поиграв с этим, я получил его работу. И спасибо вам большое! До сих пор ... Я сохраняю данные JSON для синтаксического анализа в нескольких массивах ... которые сделали сортировку и другие подобные действия довольно сложными. Теперь я могу просто использовать класс и использовать свойство dot для доступа к данным, которые мне нужны ..... ah man, это поможет так много :) Спасибо. – Supertecnoboff

+1

@Supertecnoboff: Это мое приятельское удовольствие. Рад помочь вам. :) Получили ли вы, как добавлять объекты в массив со свойствами? –