Swift:从 EKEventStore 获取到 tableView 数据后对 EKEvents 进行日期排序

Swift: Date sorting EKEvents after fetching from EKEventStore into tableView data

简介

上下文:

我正在开发一个小应用程序,我在其中使用 EKEventStore 来获取用户事件。我正在获取接下来 10 天(从用户打开应用程序时起)的所有 EKEvent,并将它们存储到 EKEvent 数组中。然后我想对它们进行排序(见下文)并将它们用作我的 tableView 日历的数据。

问题:

问题:

表视图结构说明:

  1. 我有 11 个部分对应接下来的 11 天。 (所以是11段的静态值)
  2. 我想显示在该部分提供的日期发生的事件。
  3. 另外,不是全天事件的事件将首先显示在一个单元格类型的部分中,然后全天的事件显示在另一种单元格类型中。
  4. 为我的数据中的以下语法留出空间:dateIntervalEvents[indexPath.section][indexPath.row]allDayEvents[indexPath.section][indexPath.row]

代码:

你会如何处理这种数组结构的排序?

感谢阅读我的post。

首先,去掉你的两组 11 个数组。用嵌套数组替换每个。

接下来,填充 allDayersdateIntervals 后,您应该对它们进行排序。

然后可以迭代两个数组中的每个事件,计算与开始日期相差的天数,并更新相应的嵌套数组。

private func getEventsFromCalendarStore() {
    guard let startDate = Calendar.current.date(byAdding: .day, value: -1, to: Date()) else { return }
    guard let endDate = Calendar.current.date(byAdding: .day, value: 10, to: startDate) else { return }

    let eventStore = EKEventStore()
    var fetchedEvents : [EKEvent] = []
    var allDayers : [EKEvent] = []
    var dateIntervals : [EKEvent] = []

    let eventPredicate = eventStore.predicateForEvents(withStart: startDate, end: endDate, calendars: userCalendars)

    //getting all events and sorting them in date order.
    fetchedEvents = eventStore.events(matching: eventPredicate).sorted(by: { (e1 : EKEvent, e2 : EKEvent) -> Bool in
        return e1.compareStartDate(with: e2) == .orderedAscending
    })

    //This cant be best practice of sorting it the following way?
    print(fetchedEvents)

    for event in fetchedEvents {
        if event.isAllDay == true {
            allDayers.append(event)
        } else {
            dateIntervals.append(event)
        }
    }

    allDayers.sort { [=10=].startDate < .startDate  }
    dateIntervals.sort { [=10=].startDate < .startDate  }

    var groupedAllDayers = Array(repeating: [EKEvent](), count: 11)
    var groupedIntervals = Array(repeating: [EKEvent](), count: 11)

    for event in dateIntervals {
        let days = Calendar.current.dateComponents([.day], from: startDate, to: event.startDate).day!
        groupedIntervals[days].append(event)
    }
    for event in allDayers {
        let days = Calendar.current.dateComponents([.day], from: startDate, to: event.startDate).day!
        groupedAllDayers[days].append(event)
    }
}

最后,groupedAllDayersgroupedIntervals 将包含您的两组事件,每组按从 startDate 到事件 [=15] 的天数分组=].