【发布时间】:2018-10-10 13:07:57
【问题描述】:
简介
我正在制作一个日历应用程序,我使用 Core Data 在其中存储事件。
其组成:DateKey 作为父级(具有一对多关系)到CalendarEventModel。这个概念是DateKey 拥有一个 yyyy-dd-MM 日期字符串,并且当天发生的所有事件都作为子项添加到 DateKey 中作为 NSOrderedSet 中的CalendarEventModel。 (我使用的是类定义,没有一个实体是抽象的。)。 CalendarEventModel 是包含有关一个日历事件的信息的实体。
我试图完成的事情
一切都按预期工作,只是我无法对获取的结果进行排序。当我获取与当前日历相关的 DateKeys 时,我根本无法让它们像这样排序:
我想在 CalendarEventModels 属性startDate 之后按升序($0.startDate isAllDay = false,然后再标记为 isAllDay = true。
问题/疑问
- 我在下面代码的注释中做了一些澄清。
- 我无法让 NSSortDescriptor 正常工作(我的尝试在下面的代码中进行了注释
- 我已经阅读了关于 DateKey 的
calendarEvents属性的 NSOrderedSet,但我还没有找到如何将它用于我的排序标准。
你会如何解决这个排序问题? 如果需要更多信息,请告诉我。
我的代码
fileprivate func loadEventsFromCoreData() {
dateFormatter.dateFormat = "yyyy dd MM"
let startDate = Date()
var predicatesForFetch : [NSPredicate] = []
var dateStringArray : [String] = []
var fetchResultsArray : [DateKey]?
for num in 0...9 {
let newDate = startDate.add(TimeChunk(seconds: 0, minutes: 0, hours: 0, days: num, weeks: 0, months: 0, years: 0))
let datePredicate = dateFormatter.string(from: newDate)
dateStringArray.append(datePredicate)
predicatesForFetch.append(NSPredicate(format: "dateInfo == %@", datePredicate))
}
setupSectionArray(eventArray: dateStringArray)
// I'm getting the correct DateKeys and their events.
let compoundPredicate = NSCompoundPredicate(orPredicateWithSubpredicates: predicatesForFetch)
let eventFetch : NSFetchRequest<DateKey> = DateKey.fetchRequest()
eventFetch.predicate = compoundPredicate
// I've tried specifying this sortDescriptor and added it to the eventFetch:
// let descriptor = NSSortDescriptor(key: "calendarEvents", ascending: true) { ($0 as! CalendarEventModel).startDate!.compare(($1 as! CalendarEventModel).startDate!) }
// let sortDescriptors = [descriptor]
// eventFetch.sortDescriptors = sortDescriptors
do {
fetchResultsArray = try coreDataContext.fetch(eventFetch)
} catch {
print("Core Data initial fetch failed in Calendar Controller: \(error)")
}
guard fetchResultsArray != nil else { return }
// Xcode doesn't recognize the .sort() function which does not have a return value... and I don't think its a good idea to use the return function at all since I will have to delete all children and re add the sorted for each fetch.
for eventArray in fetchResultsArray! {
eventArray.calendarEvents?.sorted(by: { ($0 as! CalendarEventModel).startDate!.compare(($1 as! CalendarEventModel).startDate!) == .orderedAscending })
eventArray.calendarEvents?.sorted { ($0 as! CalendarEventModel).isAllDay && !($1 as! CalendarEventModel).isAllDay }
}
events = fetchResultsArray!
}
感谢您阅读我的问题。
【问题讨论】:
标签: ios swift sorting core-data