NSPredicatefunction不起作用

我的谓词继续使用消息Unsupported函数表达式FUNCTION(SELF, "filterDistanceWithLatitude:" , latitude, longitude )来崩溃我的应用程序。 有谁知道如何解决这一问题?

 - (void)setUpFetchedResultsController { NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"NextTime"]; //Retrieve data for the place entity request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]]; //How to sort it self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.context sectionNameKeyPath:nil cacheName:nil]; //Puts the data in a NSFetchedResultsController which is oddly located in CoreDataTableViewController //Puts the data in a NSFetchedResultsController which is oddly located in CoreDataTableViewController self.filtered = self.fetchedResultsController.fetchedObjects; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"FUNCTION(self, 'filterByDistanceWithLatitude:', latitude, longtitude) > 20"]; self.filtered = [self.filtered filteredArrayUsingPredicate:predicate]; } - (double)filterByDistanceWithLatitude:(NSNumber *)latitude andLongitude:(NSNumber *)longitude { CLLocationDegrees latitudeCoor = [latitude doubleValue]; //Puts the latitude into a NextTime object. CLLocationDegrees longitudeCoor = [longitude doubleValue]; //Puts the longtitude into a NextTime object. CLLocation *loc1 = [[CLLocation alloc] initWithLatitude:latitudeCoor longitude:longitudeCoor]; CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:self.currentLocation.latitude longitude:self.currentLocation.longitude]; NSNumber *distance = [[NSNumber alloc] initWithDouble:[loc1 distanceFromLocation:loc2]]; return [distance doubleValue]; } 

对(基于SQL)的Core Data存储的获取请求不能使用基于Objective-C的谓词或排序描述符。 您只能过滤存储在数据库中的属性。

以下是“核心数据编程指南”中的相关文档:

  • 获取托管对象 :

您无法使用基于瞬态属性的谓词进行提取(尽管您可以使用瞬态属性自行在内存中进行过滤)。 …但是,总而言之,如果直接执行提取,通常不应将基于Objective-C的谓词或排序描述符添加到提取请求中。 相反,您应该将这些应用于获取的结果。

  • 获取谓词和排序描述符 :

提取和商店类型之间存在一些交互。 …另一方面,SQL存储将谓词和排序描述符编译为SQL,并在数据库本身中评估结果。 这主要是为了提高性能,但这意味着评估发生在非Cocoa环境中,因此依赖Cocoa的排序描述符(或谓词)无法工作。

‘filterDistanceWithLatitude:’可能应该是’filterByDistanceWithLatitude:’