Core Data хочет, чтобы мой аргумент предиката был NSNumber и NSDate

У меня есть модель с событиями, у которых есть несколько UpcomingDates, каждое из которых имеет дату свойства типа (NS) Date. Я создаю запрос на выборку, чтобы получать только те события, которые имеют предстоящие даты между двумя заданными датами. Проблема в том, что независимо от того, как я форматирую даты ввода в моем предикате, я получаю исключение. Похоже, Core Data хочет, чтобы мои аргументы предиката были как NSDates, так и NSNumbers.

Когда я передаю NSNumbers, выполняя @ ([date timeIntervalSinceReferenceDate]), я вижу следующее:

predicate: 0 != SUBQUERY(upcomingDates, $upcomingDate, $upcomingDate.date >= 387270000 AND $upcomingDate.date <= 387356400).@count
-[__NSCFNumber timeIntervalSinceReferenceDate]: unrecognized selector sent to instance 0x865a0b0

Когда я иду интуитивно понятным путем с простыми старыми NSDates, я вижу следующее:

predicate: 0 != SUBQUERY(upcomingDates, $upcomingDate, $upcomingDate.date >= CAST(387270000.000000, "NSDate") AND $upcomingDate.date <= CAST(387356400.000000, "NSDate")).@count
-[__NSDate objCType]: unrecognized selector sent to instance 0x86c6450

Распечатывая объект, получающий нераспознанный селектор, он всегда является первым из аргументов предиката.

Я в меру своих возможностей убедился, что upcomingDate.date на самом деле является NSDate (это то, что указывает модель, но я также посмотрел на то, что было передано при их создании). Я пробовал использовать каждую перестановку CAST в NSDates и NSNumbers. Я разбил предикат до простейшего возможного случая, что на самом деле означает просто удаление одного из предикатов подзапроса с AND. Я в тупике.

ETA: Предикаты следующие. Номера NS:

[NSPredicate predicateWithFormat:@"0 != (SUBQUERY(upcomingDates, $upcomingDate, ($upcomingDate.date >= %@) AND ($upcomingDate.date <= %@))).@count", @([self.timeFilterRange[0] timeIntervalSinceReferenceDate]), @([self.timeFilterRange[1] timeIntervalSinceReferenceDate])]

NSDates:

[NSPredicate predicateWithFormat:@"0 != (SUBQUERY(upcomingDates, $upcomingDate, ($upcomingDate.date >= %@) AND ($upcomingDate.date <= %@))).@count", self.timeFilterRange[0] , self.timeFilterRange[1] ]

person Joel Kraut    schedule 10.04.2013    source источник
comment
Каким образом вы можете дать нам (обфусцированные версии) предикаты?   -  person CodaFi    schedule 11.04.2013
comment
Конечно, они вполне соответствуют вашим ожиданиям. Добавил в пост.   -  person Joel Kraut    schedule 11.04.2013
comment
Можете ли вы гарантировать типы объектов в timeFilterRange?   -  person CodaFi    schedule 11.04.2013
comment
Ага, я сам их делаю. (lldb) po self.timeFilterRange [0] $ 1 = 0x08603950 2013-04-10 07:00:00 +0000 (lldb) po [self.timeFilterRange [0] класс] $ 2 = 0x0248accc __NSDate   -  person Joel Kraut    schedule 11.04.2013
comment
Я не могу воспроизвести проблему. Версия NSDate у меня работает без проблем, именно с вашим SUBQUERY.   -  person Martin R    schedule 11.04.2013
comment
Спасибо, что попробовали, @MartinR. Теперь я думаю о чем-то менее эзотерическом / более глупом, например, может быть, я обращаюсь к одному и тому же MOC в нескольких потоках или что-то в этом роде ...   -  person Joel Kraut    schedule 11.04.2013


Ответы (1)


Как ни странно, проблема была в подзапросе. Когда я использую этот новый предикат, я могу получать или не получать правильные результаты (мои настройки таковы, что сейчас сложно протестировать), но, по крайней мере, я не получаю сбоев.

NSArray *times = @[@([self.timeFilterRange[0] timeIntervalSinceReferenceDate]),
                       @([self.timeFilterRange[1] timeIntervalSinceReferenceDate])];
[NSPredicate predicateWithFormat:@"ANY upcomingDates.date BETWEEN %@", times]
person Joel Kraut    schedule 13.04.2013