函数不工作的NSPredicate [英] NSPredicate With FUNCTION Not Working

查看:127
本文介绍了函数不工作的NSPredicate的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的谓词不断地崩溃我的应用程序消息不支持的函数表达式 FUNCTION(SELF,filterDistanceWithLatitude:,纬度,经度)。有没有人知道如何解决这个问题?

My predicate keeps on crashing my app with the message Unsupported function expression FUNCTION(SELF, "filterDistanceWithLatitude:" , latitude, longitude). Does anyone know how to fix this?

- (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的谓词或排序描述符。

A fetch request for a (SQL based) Core Data store cannot use Objective-C based predicates or sort descriptors. You can only filter on attributes stored in the data base.

这里是核心数据编程指南的相关文档:

Here is the relevant documentation from the "Core Data Programming Guide":

  • Fetching Managed Objects:

不能使用基于瞬态属性的谓词来获取
(虽然您可以使用瞬态属性在内存中过滤
)。 ...总而言之,如果你直接执行一个fetch,你应该
通常不添加基于Objective-C的谓词或排序描述符到
获取请求。

You cannot fetch using a predicate based on transient properties (although you can use transient properties to filter in memory yourself). ... To summarize, though, if you execute a fetch directly, you should typically not add Objective-C-based predicates or sort descriptors to the fetch request. Instead you should apply these to the results of the fetch.




  • Fetch Predicates和排序描述符

    • Fetch Predicates and Sort Descriptors:

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

      There are some interactions between fetching and the type of store. ... The SQL store, on the other hand, compiles the predicate and sort descriptors to SQL and evaluates the result in the database itself. This is done primarily for performance, but it means that evaluation happens in a non-Cocoa environment, and so sort descriptors (or predicates) that rely on Cocoa cannot work.

      这篇关于函数不工作的NSPredicate的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆