过滤域对象只能按属性获取一个(不同的)对象

时间:2018-02-12 08:59:08

标签: swift realm distinct nspredicate

让我解释一下原因标题可能有点令人困惑。

假设我有类型为Movie的领域对象:

Movie1(id: 0, genre: "horror")

Movie2(id: 1, genre: "horror")

Movie3(id: 3, genre: "sci-fi")

我需要做的是获得每个类型的第一个(在这种情况下为Movie1Movie3

我只想使用realm + NSPredicate来完成w / o循环,所以性能更好,但我有点卡在那里......

到目前为止,我得到的是:

Realm().objects(Movie.self).sorted(byKeyPath: id, ascending: true)
.value(forKeyPath: "@distinctUnionOfObjects.genre") 

这会返回一个带("horror", "sci-fi")的数组,我无法确定下一步应该是什么。如果我尝试做:

 .filter("genre IN %@", arrayWithDistinctGenres) 

它将返回所有对象。

可能这很简单,但我无法想象如何去做。

感谢任何帮助。

2 个答案:

答案 0 :(得分:13)

从Realm Swift 3.1开始,你可以let movies = realm.objects(Movie.self).sorted(by: ["id", true]).distinct(by: ["genre"]),它将使用在不同操作之前应用的排序顺序选择每个类型的第一个Movie

答案 1 :(得分:2)

您需要一次过滤一种类型。像这样的东西

let genres = realm.objects(Genres.self)
let movies = realm.objects(Movie.self).sorted(byKeyPath: id, ascending: true)

for genre in genres {
    let firstInThisGenre = movies.filter({ $0.genreId == genre.id }).first
}