Xcode 使用NSFetchedResultsController排序时出现问题
我正在使用NSFetchedResultsController为UITableView检索数据。它很好用。现在,我需要放置三个按钮,它们将触发表视图上的不同排序。为此,我实施了:Xcode 使用NSFetchedResultsController排序时出现问题,xcode,sorting,nssortdescriptor,nsfetchedresultscontroller,Xcode,Sorting,Nssortdescriptor,Nsfetchedresultscontroller,我正在使用NSFetchedResultsController为UITableView检索数据。它很好用。现在,我需要放置三个按钮,它们将触发表视图上的不同排序。为此,我实施了: switch (selectedOrder) { case 0: sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; break; case 1:
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;}
我似乎找不到办法让第二个案例(价格)起作用。事实上,如果我使用块,它会考虑属性,但作为字符串,而不是数字。这就像块中的代码根本没有执行一样。事实上,如果我只是返回一个DeredName,它仍然将其作为字符串排序。并且不执行日志。如果使用@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
..... .....
)
我一定犯了一个很小的错误。
感谢您的帮助。我完成这项工作的方法是在按钮的iAction中定义排序,并在@property中创建NSFetchRequest*请求。在按钮操作中,我执行以下操作:
self.request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"distance" ascending:YES]];
[self.fetchedResultsController performFetch:&error];
[tableView reloadData];
你不能那样做。如果将SQLite后端用于核心数据,则排序工作在SQL级别。
不能使用自定义比较选择器或块。您必须仅按实体的属性进行排序 为什么不将价格保存为十进制数(即a),这样就不会出现双精度和浮点精度问题 然后,您可以使用price对数据进行排序