【问题标题】:Sort fetch request based on relationship attribute根据关系属性对获取请求进行排序
【发布时间】:2015-10-12 18:32:02
【问题描述】:

假设我必须实体; ItemLocalizableStringLocalizableString 实体有两个属性; stringlocaleItem 实体与LocalizableString 有一对多关系,称为localizedTitles。每个“语言环境”都有一个字符串实体。

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

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

【问题讨论】:

    标签: ios core-data nsfetchrequest nssortdescriptor


    【解决方案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
    

    【讨论】:

    • 也许我的问题不清楚。但我需要能够对 LocalizableString 进行 排序
    • 好的,我已经扩展了我的答案。
    • 这实际上是我刚刚做的!我的主要获取请求是针对LocalizableString 实体,其中我的Item 的标题的反向关系不为零。我要更新我的问题!
    • 所以你应该接受这个答案。您可以在 fetched results 控制器中使用此 fetch 请求。如果它们为 nil,即不存在,则查询将不会返回和标题。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多