【问题标题】:Sort the Parent object based on a child element inside a NSSet of the parent object根据父对象的 NSSet 中的子元素对父对象进行排序
【发布时间】:2020-06-24 17:16:44
【问题描述】:

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

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

}

我的尝试如下。我想比较每个 Account 的 last created_date,并返回一个排序后的 Accounts 数组

 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]}

【问题讨论】:

  • 集合是无序的
  • 是的,但你可以将所有对象投射到 NSSet 中
  • 您可能正在寻找.sort.sorted 方法;不是.filter
  • @NewDev 你能写代码sn-p吗?我卡住了
  • 要对数组进行排序,您可以使用.sort 就地排序,或者使用.sorted 返回一个排序后的数组,如下所示:let sorted = [3,4,1,0].sorted(by: { $0 > $1 }),它将从高到低排序。在您的情况下,您需要弄清楚您希望如何找到每个帐户的日志,以便与另一个帐户进行比较

标签: ios swift core-data


【解决方案1】:

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

我建议您更新您的 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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-02
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    相关资源
    最近更新 更多