Как я могу отсортировать свой UITableView в алфавитном порядке с NSFetchedResultsController? - PullRequest
0 голосов
/ 14 апреля 2011

Когда пользователь нажимает «сортировать по алфавиту», я вызываю следующий метод для своей таблицы:

- (void) sortByName
{
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

    NSMutableArray *items = [[fetchedResultsController fetchedObjects] mutableCopy];
    [items sortUsingDescriptors:sortDescriptors];

    int newDisplayOrder = 0;

    for (NSManagedObject *managedObject in items)
    {
        [managedObject setValue:[NSNumber numberWithInt:newDisplayOrder++ ] forKey:@"displayOrder"];
    }

    [sortDescriptor release];
    [sortDescriptors release];

    // Save the context.
    NSError *error = nil;
    if (![self.managedObjectContext save:&error])
    {
       // Need code to handle error properly
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }        
}

Но по какой-то причине, вместо сортировки по алфавиту, кажется, что каждый элемент упорядочен по порядку.был создан.Что я делаю не так?

Ответы [ 4 ]

1 голос
/ 14 апреля 2011

Хорошо выглядит.

Вы настроили контроллер результатов выборки для сортировки в соответствии с displayOrder?

Кроме того, вы должны освободить элементы в вашем коде ...

0 голосов
/ 14 апреля 2011

Почему бы вам не установить дескриптор сортировки при извлечении объектов.

0 голосов
/ 14 апреля 2011

Кажется, вы не обновляете таблицу с отсортированным массивом.Я использую следующий метод в одном из моих проектов для сортировки массива контактов по статусу и имени:

- (void)refresh {
    if ([NSThread isMainThread]) {
        NSSortDescriptor *descriptorStatus = [[[NSSortDescriptor alloc] initWithKey:@"status" ascending:NO selector:@selector(statusCompare:)] autorelease];
        NSSortDescriptor *descriptorName = [[[NSSortDescriptor alloc] initWithKey:@"displayName" ascending:YES] autorelease]; 
        [contactArray sortUsingDescriptors:[NSArray arrayWithObjects:descriptorStatus, descriptorName, nil]];

        [tableView reloadData];
    } else {
        [self performSelectorOnMainThread:@selector(refresh) withObject:nil waitUntilDone:NO];
    }
}

Для вашего проекта вам, вероятно, не нужно проверять, выполняется ли обновление в основной цепочке, если только данные не получены из какого-либо потока, кроме основного потока.

0 голосов
/ 14 апреля 2011

Попробуйте это:

NSMutableArray *items = [NSMutableArray arrayWithArray:fetchedResultsController.fetchedObjects];

или сделайте это за один шаг (не нужно изменять):

NSArray *items = [fetchedResultsController.fetchedObjects sortedArrayUsingDescriptors:sortDescriptors];

В целом, это кажется запутанным способомсортировки таблицы.Вы модифицируете displayIndex в БД, чтобы отразить новый порядок сортировки.Предположительно, NSFetchRequest, управляющий fetchedResultsController, сортирует на основе displayIndex.

Было бы проще и не требовать изменений в БД для простого изменения fetchRequest и перенастройки fetchedResultsController.

Из NSFetchedResultsController doc:1012 *

Изменение запроса на выборку

Вы не можете просто изменить запрос на выборку, чтобы изменить результаты.Если вы хотите изменить запрос на выборку, вы должны:

Если вы используете кеш, удалите его (используя deleteCacheWithName :).Обычно вы не должны использовать кеш, если вы изменяете запрос на выборку.

Измените запрос на выборку.Вызвать executeFetch:.

...