让我解释一下原因标题可能有点令人困惑。
假设我有类型为Movie的领域对象:
Movie1(id: 0, genre: "horror")
Movie2(id: 1, genre: "horror")
Movie3(id: 3, genre: "sci-fi")
我需要做的是获得每个类型的第一个(在这种情况下为Movie1
和Movie3
)
我只想使用realm
+ NSPredicate
来完成w / o循环,所以性能更好,但我有点卡在那里......
到目前为止,我得到的是:
Realm().objects(Movie.self).sorted(byKeyPath: id, ascending: true)
.value(forKeyPath: "@distinctUnionOfObjects.genre")
这会返回一个带("horror", "sci-fi")
的数组,我无法确定下一步应该是什么。如果我尝试做:
.filter("genre IN %@", arrayWithDistinctGenres)
它将返回所有对象。
可能这很简单,但我无法想象如何去做。
感谢任何帮助。
答案 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
}