Я храню список дней рождения в Core Data, и я использую NSFetchedResultsController
, чтобы вернуть все дни рождения в Core Data. Главный вопрос, который у меня есть, - это год. Я хочу показать дни рождения, которые происходят через месяц. Но, как вы знаете, человек может родиться 18 октября 2005 года, но сравнение его с датой через месяц не сработает, потому что, предположив сегодня, 15 октября 2016 года я буду сравнивать 1 ноября 2016 года с 18 октября 2005 года поэтому мое приложение подумает, что день рождения не произойдет через месяц. Как проверить, происходит ли день рождения в следующем месяце с использованием NSPredicate?Верните все дни рождения, хранящиеся в базовых данных, которые происходят через 1 месяц
Вот код, я использую прямо сейчас без успеха:
class BirthdayFetchedResultsController: NSFetchedResultsController<Birthday>, NSFetchedResultsControllerDelegate {
private let tableView: UITableView
init(managedObjectContext: NSManagedObjectContext, tableView: UITableView) {
self.tableView = tableView
let request: NSFetchRequest<Birthday> = Birthday.fetchRequest()
let dateSortDescriptor = NSSortDescriptor(key: "date", ascending: true)
request.sortDescriptors = [dateSortDescriptor]
let startOfDay = Calendar.current.startOfDay(for: Date()) as NSDate
// FIXME: The year matters here when it shouldn't.
let predicate = NSPredicate(format: "date >= %@", startOfDay)
request.predicate = predicate
// TODO: Add section name key path for sorting the birthdays into sections
super.init(fetchRequest: request, managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
self.delegate = self
tryFetch()
}
func tryFetch() {
do {
try performFetch()
} catch let error as NSError {
// TODO: Implement Error Handling
print("Unresolved error: \(error), \(error.userInfo)")
}
}
}
UPDATE: Теперь у меня есть представление о том, как справиться с этой проблемой. Либо месяц должен быть меньше или равен текущему месяцу плюс один, он может быть меньше, чем текущий месяц минус одиннадцать или месяц может быть одинаковым, а дата должна быть больше. Я пытался построить предикат для этого, но не кажется, что это будет работать:
let calendar = Calendar.current
let now = Date()
let month = calendar.component(.month, from: now)
let date = calendar.component(.day, from: now)
let predicate = NSPredicate(format: "((month <= %@) or (month <= %@)) or ((month == %@) AND (date >= %@))", argumentArray: [month + 2, month - 10, month, date])
request.predicate = predicate
Ваша проблема мне не ясна. Все даты рождения (живых людей) в прошлом, и все люди будут иметь день рождения в будущем. Итак, какие именно записи должны отображаться? Если сегодня 15 октября 2016 года, должно ли отображаться лицо, родившееся 1 апреля 2000 года, или нет? –
@MartinR Хорошая точка. Возможно, я должен перефразировать мой вопрос. Как сортировать день рождения, чтобы день рождения, который уже был, дошел до конца массива? Имеет ли это смысл? В принципе, мой конечный результат состоит в том, чтобы иметь раздел, который показывает все дни рождения, следующие через неделю, а другой - дни рождения, следующие за 1 месяц, и игнорируют все другие дни рождения. Я отредактирую свой вопрос. – Harish