基于关系属性对获取请求进行排序

时间:2015-10-12 18:32:03

标签: ios core-data nsfetchrequest nssortdescriptor

让我说我必须要实体; ItemLocalizableStringLocalizableString实体有两个属性; stringlocaleItem实体与名为LocalizableString的{​​{1}}具有多对多关系。每个" locale"。

中有一个字符串实体

现在,在我的应用程序中,我有一些上下文/设置,用于确定在显示UI时我想要使用的localizedTitles。因此,我要说locale UITableViewController处理数据流。

我的问题是:我可以根据NSFetchedResultsController的{​​{1}}属性对Item个实体进行排序,例如LocalizableString string ?我是否可以在获取请求中执行此操作,而不是在获取所有项目之后?

2 个答案:

答案 0 :(得分:1)

当然,您可以这样做,但您不必提前获取任何特定的区域设置。您获取的结果控制器只会获取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排序。现在,要填充表格,您可以通过跟随另一个方向的关系来获得该项目。

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

答案 1 :(得分:0)

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

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