根据关系属性对提取请求进行排序
假设我需要实体; Item和LocalizableString 。 LocalizableString实体有两个属性; string和locale 。 Item实体与LocalizableString具有多对多的关系,称为localizedTitles 。 每个“locale”有一个字符串实体。
现在,在我的应用程序中,我有一些上下文/设置,用于确定显示UI时要使用的locale 。 假设我有一个带有NSFetchedResultsController的UITableViewController来处理数据流。
我的问题是:我可以根据LocalizableString的string属性排序Item实体,其中locale是例如en ? 我可以在获取请求中执行此操作,而不是在获取所有项目后执行此操作?
当然你可以做到这一点,但你不必提前获取任何特定的区域设置。 您提取的结果控制器只会获取Item对象,然后您可以根据需要引用正确的字符串。
实现此目的的一种方法是为Item类添加一个便捷函数,如下所示
func titleWithLocale(identifier: String) -> String? {
if let title = self.localizedTitles.filter
{ $0.locale == identifier }
.first as? LocalizableString {
return title.string
}
return nil
}
很可能你必须调整这些代码以符合严格的Swift输入,但你明白了。
如果您需要按标题字符串进行排序,则可能需要采用不同的方法。 如果您知道每个Item在各自的区域设置中都有本地化标题,则可以使用谓词来获取LocalizedTitle实体:区域设置的筛选器:
request.predicate = NSPredicate(format: "locale = %@", "en")
显然,你可以用通常的排序描述符按string排序。 现在,要填充表格,您可以通过沿着另一个方向的relationshp进入该项目。
let title = fetchedResultsController.objectAtIndexPath(indexPath)!
let item = title.item
我最终为我的LocalizableString实体做了一个获取请求。 用一个检查locale和相反关系的谓词:
NSPredicate(format: "locale == %@ AND itemName != nil", locale)
