有没有办法检查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
答案 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。如果您有任何具体问题,也欢迎您给我发电子邮件。