使用NSFetchedResultsController排序时出现问题

时间:2012-01-07 18:26:01

标签: xcode sorting nssortdescriptor nsfetchedresultscontroller

我正在使用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 个答案:

答案 0 :(得分:1)

你不能那样做。如果您使用SQLite后端进行核心数据,则订购适用于SQL级别 您不能使用自定义比较选择器或块。您必须按实体的属性进行排序

为什么不将价格保存为十进制数(即NSDecimalNumber),它没有像double和float这样的精度问题。

然后您可以使用价格对数据进行排序。

答案 1 :(得分:-1)

我完成此操作的方法是在按钮的IBAction中定义排序并在@property中创建NSFetchRequest *请求。在按钮操作中,我这样做:

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