根据关系属性对获取请求进行排序

Sort fetch request based on relationship attribute

假设我必须实体; ItemLocalizableStringLocalizableString 实体有两个属性; stringlocaleItem 实体与称为 localizedTitlesLocalizableString 具有一对多关系。每个 "locale".

有一个字符串实体

现在,在我的应用程序中,我有一些 context/setting 来确定 locale 在显示 UI 时我想使用什么。假设我有一个 UITableViewController 和一个 NSFetchedResultsController 处理数据流。

我的问题是:我可以根据 LocalizableStringstring 属性 对 Item 实体进行排序,例如 locale 25=]?我可以在 获取请求 中执行此操作,而不是在获取所有项目之后执行此操作吗?

当然可以,但是您不必预先获取任何特定的语言环境。您的获取结果控制器将只获取 Item objects,然后您可以根据需要引用正确的字符串。

实现此目的的一种方法是向 Item class 添加一个方便的函数,如下所示

func titleWithLocale(identifier: String) -> String? {
   if let title = self.localizedTitles.filter 
         { [=10=].locale == identifier }
         .first as? LocalizableString {
     return title.string
   }
   return nil
}

很可能您必须调整此代码以符合 Swift 的严格类型,但您明白了。

如果您需要按标题字符串排序,也许您需要一种不同的方法。如果您知道每个 Item 在各自的语言环境中都有一个本地化的标题,您可以获取带有谓词的 LocalizedTitle 实体 语言环境的过滤器:

 request.predicate = NSPredicate(format: "locale = %@", "en")

显然,您可以使用通常的排序描述符按 string 排序。现在,要填充您的 table,您可以按照另一个方向的关系找到该项目。

 let title = fetchedResultsController.objectAtIndexPath(indexPath)!
 let item = title.item

我最终为我的 LocalizableString 实体发出了获取请求。使用检查 locale 和反向关系的谓词:

NSPredicate(format: "locale == %@ AND itemName != nil", locale)