Проблемы сортировки с NSFetchedResultsController - PullRequest
0 голосов
/ 07 января 2012

Я использую NSFetchedResultsController для извлечения данных для UITableView. Работает нормально. Теперь мне нужно разместить три кнопки, которые должны вызывать различную сортировку в табличном представлении. Для этого я реализовал:

switch (selectedOrder) {
    case 0:
        sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
        break;
    case 1: 
        /*
        sortDescriptor = [[NSSortDescriptor alloc] initWithKey: @"price"  ascending: NO 
                                                    comparator: ^(id obj1, id obj2) {
                                                        NSLog(@"Test");
                                                        return numSort(obj1, obj2, nil);
                                                        //return NSOrderedSame;
                                                    }];
         */
        sortDescriptor = [[NSSortDescriptor alloc] initWithKey: @"price" 
                                                     ascending: NO 
                                                      selector:@selector(compareAsFloats:)];

        break;
    ...
    default:
        break;}

Кажется, я не нахожу способ заставить работать второй случай (цену). На самом деле, если я использую блок, он учитывает свойство, но не как число, а как строку. Это похоже на то, что код в блоке не был выполнен вообще. На самом деле, если я просто верну NSOrderedSame, он все равно упорядочит его в виде строки. И журнал не выполняется. Если я использую версию @selector (compareAsFloats :), где метод определен в категории NSString, я получаю ошибку времени выполнения:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'unsupported NSSortDescriptor selector: compareAsFloats:'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x014df5a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x01889313 objc_exception_throw + 44
    2   CoreData                            0x01211266 -[NSSQLGenerator newSQLStatementForFetchRequest:ignoreInheritance:countOnly:nestingLevel:] + 1270
    3   CoreData                            0x011494d8 -[NSSQLAdapter _newSelectStatementWithFetchRequest:ignoreInheritance:] + 488
    4   CoreData                            0x011492e1 -[NSSQLAdapter newSelectStatementWithFetchRequest:] + 49
    5   CoreData                            0x0114918e -[NSSQLCore newRowsForFetchPlan:] + 430
    .....   .....
)

Я, должно быть, делаю очень тривиальную ошибку. Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 26 января 2012

ты не можешь этого сделать. Если вы используете сервер SQLite для базовых данных, порядок работает на уровне SQL.
Вы не можете использовать пользовательские селекторы сравнения или блоки. Вы должны сортировать только по атрибутам вашей организации

Почему бы вам не сохранить цену в виде десятичного числа (это NSDecimalNumber ), у которого нет проблем с точностью, таких как double и float.

Затем вы можете просто использовать цену для сортировки ваших данных.

0 голосов
/ 26 января 2012

Я выполнил это, определив сортировку в IBAction кнопки и создав запрос NSFetchRequest * в @property.В действии кнопки я делаю это:

self.request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"distance" ascending:YES]];
[self.fetchedResultsController performFetch:&error];
[tableView reloadData];
...