NSArray от NSSet - я должен сортировать это сам? - PullRequest
32 голосов
/ 20 апреля 2010

У меня есть данные в NSSet, и мне нужно передать их в NSArray.

Нужно ли мне самому сортировать (опять же, это из Core Data) или я могу получить его в отсортированном порядке?

Ответы [ 2 ]

77 голосов
/ 20 апреля 2010

Вы можете указать сортировку при извлечении данных с NSFetchRequest, установив для свойства sortDescriptors массив NSSortDescriptor с. Но если у вас уже есть NSSet и вы не хотите делать еще один запрос на выборку, вы можете использовать:

[[theSet allObjects] sortedArrayUsingDescriptors:sortDescriptors];

Он создаст промежуточный NSArray при вызове allObjects и последующем другом отсортированном массиве, поэтому он не эффективен на 100%, но издержки должны быть незначительными для наборов данных разумного размера (и, конечно, меньше стоимость сортировки).

Редактировать

На самом деле, я был неправ - NSSet также имеет метод sortedArrayUsingDescriptors:. Так что вы можете просто позвонить [theSet sortedArrayUsingDescriptors:descriptors] и сделать все это за один раз.

8 голосов
/ 20 апреля 2010

Вы должны сами разобраться, но это не очень сложно ...

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Sprocket" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sortVariable" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];   
[request setSortDescriptors:sortDescriptors];

NSError *error;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];    
self.sprocketArray = mutableFetchResults;

[sortDescriptors release];
[sortDescriptor release];
[mutableFetchResults release];
[request release];
...