core-data - 如何序列化 NSPredicate 对象?
<p><p>有没有办法检查 NSPredicate 对象以将其序列化为 URL?我正在尝试远程检索数据,并且需要将谓词对象转换为带有服务器可以理解的查询字符串参数的 URL。</p>
<p>这受到了 WWDC 2010 上一场名为“构建服务器驱动的用户体验”的演讲的启发,演讲者在演讲中谈到了使用 Core-Data 和服务器后端。我已经关注了 session 视频和幻灯片,但被困在序列化点上。例如,有一个 <code>Person</code> 对象,我试图获取所有名字为“John”的人。我正在使用一个名为 <code>RemoteManagedObjectContext</code> 的 <code>NSManagedObjectContext</code> 子类,它覆盖了 <code>executeFetchRequest</code> 方法,并且应该将调用发送到服务器。提取请求被创建为(省略的非必要部分):</p>
<pre><code>@implementation PeopleViewController
- (NSArray *)getPeople {
RemoteFetchRequest *fetchRequest = [ init];
NSEntityDescription *entity = ...
NSPredicate *template = [NSPredicate predicateWithFormat:
@"name == $NAME AND endpoint = $ENDPOINT"];
NSPredicate *predicate = ;
;
;
NSError *error = nil;
// the custom subclass of NSManagedObjectContext executes this
return ;
}
@end
</code></pre>
<p>现在在 <code>NSManagedObjectContext</code> 的自定义子类中,如何将获取请求序列化为适合服务器的查询字符串参数。所以给定上面的 fetch 请求,对应的 URL 是:</p>
<pre><code>http://example.com/people?name=John
</code></pre>
<p>可以获得返回的谓词的字符串表示,</p>
<pre><code>name == "John" AND endpoint == "people"
</code></pre>
<p>我可以解析得到参数 <code>name</code> 和 <code>endpoint</code>。但是,是否可以在不解析字符串的情况下做到这一点?这是 <code>RemoteManagedObjectContext</code> 类的部分实现。</p>
<pre><code>@implementation RemoteManagedObjectContext
- (NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error {
// this gives name == "John" AND endpoint == "people"
// don't know how else to retrieve the predicate data
NSLog(@"%@", [ predicateFormat]);
...
}
@end
</code></pre></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>甚至比字符串表示更好的是面向对象的表示!而且它是自动完成的!</p>
<p>首先,检查 <code>NSPredicate</code> 的类。它将是一个 <code>NSCompoundPredicate</code>。将其转换为适当的变量。</p>
<p>然后您会看到它的 <code>compoundPredicateType</code> 是 <code>NSAndPredicateType</code>,正如您所期望的那样。</p>
<p>还可以看到<code>-subpredicates</code>返回的数组揭示了2个<code>NSComparisonPredicates</code>。</p>
<p>第一个子谓词有一个<code>NSKeyPathExpressionType</code>类型的左表达式和一个<code>@"name"</code>的<code>-keyPath</code>,操作符是<code> NSEqualToPredicateOperatorType</code>。正确的表达式将是 <code>NSConstantValueExpressionType</code> 类型的 <code>NSExpression</code>,而 <code>-constantValue</code> 将是 <code>@"John"</code>。 </p>
<p>第二个子谓词类似,除了左边表达式的 <code>keyPath</code> 将是 <code>@"endpoint"</code>,而右边表达式的 <code>constantValue</code> 将成为<code>@"people"</code>。</p>
<p>如果您想更深入地了解如何将 <code>NSPredicates</code> 转换为 HTTP Get 请求,请查看我的 <a href="https://github.com/davedelong/StackKit" rel="noreferrer noopener nofollow">StackOverflow framework, "StackKit"</a> ,它就是这样做的。它基本上是一个行为类似于 CoreData 的框架,但使用 StackOverflow.com(或任何其他堆栈交换站点)来检索信息。在下面,它正在执行 <em>lot</em> 将 <code>NSPredicate</code> 对象转换为 URL。如果您有任何具体问题,也欢迎您给我发电子邮件。</p></p>
<p style="font-size: 20px;">关于core-data - 如何序列化 NSPredicate 对象?,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/4119642/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/4119642/
</a>
</p>
页:
[1]