У меня есть модель Core Data, в которой объект Task включает в себя необязательное отношение to-many ExcludedDays к объекту ExcludedDay. Одним из свойств ExcludedDay является день, который является объектом NSDate. Объект ExcludedDay имеет обратное обязательное отношение к одному объекту Task.
Чтобы получить задания в течение указанного дня, мне нужно убедиться, что указанный день не отображается как свойство day любого объекта ExludedDay.
Я начал пробовать
NSPredicate *dayIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"ALL excludedDays.day != %@", today];
Однако, несмотря на то, что говорится в документации, ALL не работает, и приложение выдает исключение: Завершение приложения из-за неотображенного исключения 'NSInvalidArgumentException, reason:' Неподдерживаемый предикат.
После публикации того же вопроса на этом форуме, я смог разработать следующий предикат с помощью разных людей:
NSPredicate * dayIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"[email protected] == 0 || ([email protected] > 0 && NONE excludedDays.day == %@))", today];
Пока это работало, я только что обнаружил, что это работает только тогда, когда объект ExcludedDay содержит ТОЛЬКО один день. Как только объект ExcludedDay содержит более одного дня для одной задачи, этот предикат перестает работать. В результате задача выбирается в течение дня, даже если день появляется как день в объекте ExcludedDay, что, конечно, неверно. Проблема не связана с тем, что день свойства является объектом NSDate: заменяя день соответствующей NSString или эквивалентно целому числу, я по-прежнему сталкиваюсь с той же проблемой и неправильным поведением.
Каков правильный способ реализации предиката в этом случае? Может быть, это ошибка, связанная с любым агрегирующим оператором при использовании основных данных? Заранее спасибо, теперь это сводит меня с ума.