根据父对象的 NSSet 内的子元素对父对象进行排序



我有一个一对多的核心数据对象图关系,其中一个帐户可以有很多日志(帐户<->>日志(。我的目标是根据子对象的值(日志中的日期(对我从获取请求中获得的帐户数组进行排序

extension Account {
@NSManaged public var account_id: String?
@NSManaged public var logs: NSSet?
}
extension SalesLogs {
@NSManaged public var created_date: String?
@NSManaged public var is_modified: Bool
}

我的尝试就像风箱一样。我想比较每个帐户的最后created_date,并返回一个排序的帐户数组

let fetchData : [Accounts]= try StorageManager.shared.fetchData(entity: "SalesLogs", model: SalesLogs.self)
let sorted array:[Accounts] = fetchData.filter{($0.logs?.allObjects as! [SalesLogs]).map {$0.created_date ?? "" > }.last == [true]}

首先,您需要确定要作为排序依据的日志日期。如果它是最新的,那么您需要先找到它。

我建议您更新SalesLogs以实际处理日期而不是字符串,因为您可以轻松比较日期并找到最大值(即最新(。

extension SalesLogs {
var createdDate: Date {
let formatter = DateFormater()
formatter.dateFormat = ...
// I'm avoiding an optional Date for simplicity
return formatter.date(from: self.created_date ?? "") ?? Date.distantPast
}
}

有了这个,你需要找到一个集合中的最新日期,并使用它来对数组进行排序:

let sorted = fetchData.sorted { a, b in
let logsA = a.logs as? Set<SalesLogs>
let logsB = b.logs as? Set<SalesLogs>
// find the latest (aka max) createdDate
let dateA = logsA?.map{ $0.createdDate }.max{ $0 < $1 }
let dateB = logsB?.map{ $0.createdDate }.max{ $0 < $1 }
return (dateA ?? Date.distantPast) < ( dateB ?? Date.distantPast)
}

最新更新