2

我的模型有一个领域对象,它通过 propertyGroupOfEvents与领域对象建立了一对多的关系。每个人都有一个财产。EventeventsEventdate

我有一个Results<GroupOfEvents>,我想按date中的第一个事件排序events。如果我对一个常规的 swift 数组进行排序,它看起来像:

groupsOfEvents.sorted(by: { $0.events.first!.date > $1.events.first!.date })

这是我对 a 进行排序的失败尝试Results<GroupOfEvents>

groupsOfEvents.sorted(byKeyPath: "events.first.date")

它给出了错误:

'无法对关键路径'events.first.date'进行排序:属性'GroupOfEvents.events'的类型'array'不受支持。'

我怎样才能按照我想要的方式对其进行排序?


你可能会问我的问题:

你为什么按第一个事件的日期排序?这不是人们通常会做的事情。

事实上,GroupOfEvents包含具有相同日期的事件,因此使用任何事件的日期events都可以。

你为什么不把date财产搬到GroupOfEvents?

是的,我可以这样做,但我正在寻找替代方案。

您为什么不摆脱GroupOfEvents并在日期之前获得所有Events当时的小组?

尽管所有eventsGroupOfEvents日期都相同。两个不同的事件GroupOfEvents也可以有相同的日期。还有其他的特性可以区分GroupOfEvents

4

3 回答 3

0

从 Realm 的头文件中,我看到了这条评论:

集合只能按boolean, Date, NSDate, 单精度和双精度floating point, integer, 和string类型的属性排序。

这意味着您的事件数组不是受支持的键路径,正如您收到的错误所说的那样。

更新

根据这个答案,您可以将类型的对象Results转换为数组。因此,您可以尝试以下方法:

let groupsOfEventsSortedArray = Array(groupsOfEvents).sorted { $0.events.first!.date > $1.events.first!.date }
于 2018-08-22T09:38:20.167 回答
0

目前,你不能这样做。它应该在任何“领域限制列表”中进行描述,但事实并非如此。其实这个问题在github上有一个issue:Support of keypathsorting for to-many relationship

以下是有关该问题的一些解决方法:

  1. 最好的解决方案是添加firstEvent: EventGroupOfEvents模型中。Support sort by keypath说,您可以按.sorted(byKeyPath: "firstEvent.date"). 但它引入了额外的工作来同步firstEventevents.first.

  2. 对程序员来说最便宜的方式,对效率来说可能也是最糟糕的方式——先转换Array然后排序。非常简单,但正如您所知,realm 只有在您开始使用它时才会给您对象(即,lazy它们可以放置在任何可以放置的地方)。如果您没有大量数据 - 这应该很好用。


此外,Realm 有很好的NSPredicate Cheatsheet,它涵盖了有用的模式并用粉红点标记支持的案例。

于 2018-08-23T10:05:09.277 回答
0

我不确定我是否正确理解了这个问题,但Results该类有一个sorted接受 a 的函数Sequence(请参阅文档)。因此,您只需执行以下操作:

func sortGroupOfEvents(e1: GroupOfEvents, e2: GroupOfEvents) -> Bool{
    guard let date1 = e1.events.first?.date else {return false}
    guard let date2 = e2.events.first?.date else {return true}
    return date1 > date2
}

groupsOfEvents.sorted(by: sortGroupOfEvents)
于 2018-08-27T22:08:41.427 回答