gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 11:49:44 25 4
gpt4 key购买 nike

介绍

上下文:

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

问题:

  • 我想要数组的以下结构:var allDayEvents : [[EKEvent]]?var dateIntervalEvents : [[EKEvent]]?。其中有一个静态的 11 索引(0-10)。

  • 我相信我正在让这些代码填充得比它必须的要多得多。对我和性能而言,必须有一种更快的方法。

问题:

  • 如何以高效的方式将我从 EventStore 查询中获取的事件排序为 allDayEventsdateIntervalEvents 的语法?
    1. 我需要对日期进行排序,以便最早的在数组的每个部分中排在第一位。

tableView结构说明:

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

代码:

  • 我的获取方法。

        var allDayEvents : [EKEvent]?
    var dateIntervalEvents : [EKEvent]?

    private func getEventsFromCalendarStore() {

    let eventStore = EKEventStore()
    var fetchedEvents : [EKEvent]?
    //simulator? either way wrong dates are fetched
    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 eventPredicate = eventStore.predicateForEvents(withStart: startDate, end: endDate, calendars: userCalendars)
    fetchedEvents = eventStore.events(matching: eventPredicate)

    //Basically how to sort fetchedEvents to get the required structure of my array.

    }
  • 我尝试对数组进行排序:

    private func getEventsFromCalendarStore() {

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

    var allDay1 : [EKEvent] = []
    var allDay2 : [EKEvent] = []
    var allDay3 : [EKEvent] = []
    var allDay4 : [EKEvent] = []
    var allDay5 : [EKEvent] = []
    var allDay6 : [EKEvent] = []
    var allDay7 : [EKEvent] = []
    var allDay8 : [EKEvent] = []
    var allDay9 : [EKEvent] = []
    var allDay10 : [EKEvent] = []
    var allDay11 : [EKEvent] = []

    var dIDay1 : [EKEvent] = []
    var dIDay2 : [EKEvent] = []
    var dIDay3 : [EKEvent] = []
    var dIDay4 : [EKEvent] = []
    var dIDay5 : [EKEvent] = []
    var dIDay6 : [EKEvent] = []
    var dIDay7 : [EKEvent] = []
    var dIDay8 : [EKEvent] = []
    var dIDay9 : [EKEvent] = []
    var dIDay10 : [EKEvent] = []
    var dIDay11 : [EKEvent] = []

    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 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 {
    dateIntervalls.append(event)
    }
    }

    for event in dateIntervalls {

    if event.startDate == startDate {
    dIDay1.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    dIDay2.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    dIDay3.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    dIDay4.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    dIDay5.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    dIDay6.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    dIDay7.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    dIDay8.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    dIDay9.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    dIDay10.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    dIDay11.append(event)
    }

    }

    for event in allDayers {
    if event.startDate == startDate {
    allDay1.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    allDay2.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    allDay3.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    allDay4.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    allDay5.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    allDay6.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    allDay7.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    allDay8.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    allDay9.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    allDay10.append(event)
    } else if event.startDate == Calendar.current.date(byAdding: .day, value: 1, to: startDate) {
    allDay11.append(event)
    }
    }

    allDayEvents?.insert(allDay1, at: 0)
    allDayEvents?.insert(allDay2, at: 1)
    allDayEvents?.insert(allDay3, at: 2)
    allDayEvents?.insert(allDay4, at: 3)
    allDayEvents?.insert(allDay5, at: 4)
    allDayEvents?.insert(allDay6, at: 5)
    allDayEvents?.insert(allDay7, at: 6)
    allDayEvents?.insert(allDay8, at: 7)
    allDayEvents?.insert(allDay9, at: 8)
    allDayEvents?.insert(allDay10, at: 9)
    allDayEvents?.insert(allDay11, at: 10)

    dateIntervalEvents?.insert(dIDay1, at: 0)
    dateIntervalEvents?.insert(dIDay2, at: 1)
    dateIntervalEvents?.insert(dIDay3, at: 2)
    dateIntervalEvents?.insert(dIDay4, at: 3)
    dateIntervalEvents?.insert(dIDay5, at: 4)
    dateIntervalEvents?.insert(dIDay6, at: 5)
    dateIntervalEvents?.insert(dIDay7, at: 6)
    dateIntervalEvents?.insert(dIDay8, at: 7)
    dateIntervalEvents?.insert(dIDay9, at: 8)
    dateIntervalEvents?.insert(dIDay10, at: 9)
    dateIntervalEvents?.insert(dIDay11, at: 10)

    }

您将如何处理这种数组结构的排序?

感谢阅读我的帖子。

最佳答案

首先,去掉你的两组 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 { $0.startDate < $1.startDate }
dateIntervals.sort { $0.startDate < $1.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 开始的天数分组> 到事件的 startDate

关于ios - Swift:从 EKEventStore 获取到 tableView 数据后对 EKEvents 进行日期排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51971045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com