根据关系属性对提取请求进行排序
假设我需要实体; 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)