Введение
Я создаю приложение календаря, в котором я храню события с использованием Core Data.
Оно состоит из: DateKey
в качестве родителя (с одним ко многимотношения) к CalendarEventModel
.Концепция состоит в том, что DateKey
содержит строку даты гггг-дд-ММ, и все события, которые происходят в этот день, добавляются как дочерние элементы к этому DateKey
как CalendarEventModel
в NSOrderedSet.(Я использую определение класса, ни одна из сущностей не является абстрактной.)CalendarEventModel - это сущность, содержащая информацию об одном событии календаря.
Что я пытаюсь выполнить
Все работает так, как задумано, за исключением того, что я не могу отсортировать полученные результаты.Когда я выбираю DateKeys, относящиеся к текущему календарю, я просто не могу заставить их сортировать так:
Я хочу отсортировать CalendarEventModel в каждом DateKey после атрибута CalendarEventModels startDate
в порядке возрастания ($ 0.startDate <$ 1.startDate).Затем пометьте CalendarEventModels <code>isAllDay = false перед теми, у кого isAllDay = true
.
Проблема / Вопрос
- Я добавил некоторые пояснения в комментарии в кодениже.
- Я не могу заставить NSSortDescriptor работать должным образом (моя попытка прокомментирована в приведенном ниже коде
- Я читал о NSOrderedSet, которым является атрибут
calendarEvents
DateKey, но яЯ не нашел, как использовать его для моих критериев сортировки.
Как бы вы решили эту сортировку? Дайте мне знать, если потребуется дополнительная информация.
Мой код
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!
}
Спасибо, что прочитали мой вопрос.