根据关系属性对获取请求进行排序
Sort fetch request based on relationship attribute
假设我必须实体; Item
和 LocalizableString
。 LocalizableString
实体有两个属性; string
和 locale
。 Item
实体与称为 localizedTitles
的 LocalizableString
具有一对多关系。每个 "locale".
有一个字符串实体
现在,在我的应用程序中,我有一些 context/setting 来确定 locale
在显示 UI 时我想使用什么。假设我有一个 UITableViewController
和一个 NSFetchedResultsController
处理数据流。
我的问题是:我可以根据 LocalizableString
的 string
属性 对 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)
假设我必须实体; Item
和 LocalizableString
。 LocalizableString
实体有两个属性; string
和 locale
。 Item
实体与称为 localizedTitles
的 LocalizableString
具有一对多关系。每个 "locale".
现在,在我的应用程序中,我有一些 context/setting 来确定 locale
在显示 UI 时我想使用什么。假设我有一个 UITableViewController
和一个 NSFetchedResultsController
处理数据流。
我的问题是:我可以根据 LocalizableString
的 string
属性 对 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)