使用核心数据在 RestKit 中进行远程服务器搜索
Posted
技术标签:
【中文标题】使用核心数据在 RestKit 中进行远程服务器搜索【英文标题】:Remote Server Searching in RestKit with Core Data 【发布时间】:2013-06-20 12:37:05 【问题描述】:我有一个应用程序,它使用 RestKit 和一个用于 Core Data 的 SQLite 存储与远程 API 通信。当我要添加服务器端搜索时,我不得不找到一种有效显示搜索结果的方法。为了实现这一点,我使用了一个 NSFetchedResultsController,它与另一个与 SQLite 存储具有相同架构的内存存储相关联,并且也由 RestKit 提供支持。当 RestKit 搜索 API 的搜索端点时,它会将响应映射回内存存储。
这非常适合我的需要,但现在又引起了另一个问题。当我从服务器取回这些“瞬态”对象并且用户选择了一个时,需要在该点将其复制到持久存储中(超出该点的各种交互将从服务器加载其他对象并尝试将它们绑定回来到原始对象 - 如果它们位于两个不同的对象上下文中,则会失败)。
tl;dr
是否有人对如何将整个对象(实体和关系)从一个核心数据存储复制到另一个有任何建议?或者,这甚至有必要吗?有没有更简单的方法来使用 RestKit 完成同样的任务?
改为不使用内存存储是否会更好地为我提供服务?如果是这样,我应该如何存储这些对象?
【问题讨论】:
【参考方案1】:我不会使用内存存储。我只是将搜索结果放入主商店并绕过复制问题。然后,我将进行一次清除以清除不再需要的旧搜索结果。您可能想要标记出于某种原因需要保留的搜索结果。并且您可以让 RestKit 在执行每个新搜索时自动执行清除(请参阅 these docs 中的“获取请求块和删除孤立对象”)
关于您的其他问题,关于标记。当您发出搜索请求时,搜索词在 URL 中。如果您使用RKObjectManager
和路由,那么您可以访问提供给映射的元数据以获取搜索词并将其存储到返回的对象中。比如:
@"@metadata.routing.parameters.searchTerm": @"searchTerm",
请参阅元数据文档here。
【讨论】:
你知道我如何标记这些结果吗?我不确定如何使用 RestKit 在数据进入存储之前拦截数据,并将用于对象的搜索查询添加到对象中。我知道,在我的成功块中,我可以遍历返回的结果并添加搜索查询,然后重新保存,但这似乎效率低下。想法? Wain,我什至不知道它的存在——我认为我也很好地搜索了文档。现在我只需要一个对象存储,这为我减少了很多复杂性。谢谢! 我需要做些什么来填充@metadata.routing.parameters.query
吗? query
是查询字符串中的一个参数,用于确定搜索。
你需要使用合适的路由来发出下载请求,因为路由处理的是模式匹配。这通常是通过搜索样式请求的命名路由。
所以我有:RKRoute *searchRoute = [RKRoute routeWithName:@"search" pathPattern:@"/search/user" method:RKRequestMethodGET];
,然后是[self.objectManager.router.routeSet addRoute:searchRoute];
,我正在使用[self.objectManager getObjectsAtPathForRouteNamed...]
进行搜索并将参数字典传递给它:@@"query": searchTerm
。元数据中似乎没有任何可用的东西。以上是关于使用核心数据在 RestKit 中进行远程服务器搜索的主要内容,如果未能解决你的问题,请参考以下文章