如何序列化NSPredicate对象?

时间:2010-11-07 20:52:45

标签: core-data ios nspredicate nsfetchrequest

有没有办法检查NSPredicate对象以便将其序列化为URL?我试图远程检索数据,并需要将谓词对象转换为具有服务器理解的查询字符串参数的URL。

这是受到WWDC 2010中的一个名为“构建服务器驱动的用户体验”的演讲的启发,其中演讲者谈论使用Core-Data和服务器后端。我已经关注了会话视频和幻灯片,但我被困在序列化点上。例如,有一个Person对象,我正在尝试获取名字为“John”的所有人。我正在使用名为NSManagedObjectContext的{​​{1}}的子类,它会覆盖RemoteManagedObjectContext方法,并且应该将调用发送到服务器。获取请求被创建为(省略的非必要部分):

executeFetchRequest

现在在@implementation PeopleViewController - (NSArray *)getPeople { RemoteFetchRequest *fetchRequest = [[RemoteFetchRequest alloc] init]; NSEntityDescription *entity = ... NSPredicate *template = [NSPredicate predicateWithFormat: @"name == $NAME AND endpoint = $ENDPOINT"]; NSPredicate *predicate = [template predicateWithSubstitutionVariables:...]; [fetchRequest setEntity:entity]; [fetchRequest setPredicate:predicate]; NSError *error = nil; // the custom subclass of NSManagedObjectContext executes this return [remoteMOC executeFetchRequest:fetchRequest error:&error]; } @end 的自定义子类中,如何将获取请求序列化为适合服务器的查询字符串参数。因此,鉴于上述获取请求,相应的URL将为:

NSManagedObjectContext

可以获得返回的谓词的字符串表示,

http://example.com/people?name=John

我可以解析以获取参数name == "John" AND endpoint == "people" name。但是,是否可以在不解析字符串的情况下执行此操作?这是endpoint类的部分实现。

RemoteManagedObjectContext

1 个答案:

答案 0 :(得分:4)

甚至比字符串表示更好的是面向对象的表示!它是自动完成的!

首先,检查NSPredicate的类。它将是NSCompoundPredicate。将其转换为适当的变量。

然后,您会看到它是compoundPredicateType NSAndPredicateType,就像您期望的那样。

您还可以看到-subpredicates返回的数组显示2 NSComparisonPredicates

第一个子预测的左表达式为NSKeyPathExpressionType-keyPath@"name",运算符为NSEqualToPredicateOperatorType。正确的表达式为NSExpression类型NSConstantValueExpressionType-constantValue将为@"John"

除了左表达式keyPath@"endpoint",右表达式constantValue@"people"之外,第二个子谓词将是相似的。

如果您想了解有关将NSPredicates转换为HTTP Get请求的更多详细信息,请查看我的StackOverflow framework, "StackKit",其中就是这样。它基本上是一个与CoreData类似的框架,但使用StackOverflow.com(或任何其他堆栈交换站点)来检索信息。在下面,它正在执行 lot NSPredicate个对象转换为URL。如果您有任何具体问题,也欢迎您给我发电子邮件。