NSPredicate для max (arrayOfNSDates) - PullRequest
       18

NSPredicate для max (arrayOfNSDates)

1 голос
/ 27 сентября 2011

У меня проблема с NSPredicate.

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

Я использую что-то подобное:

[NSPredicate predicateWithFormat:@"max({1,2,3})==3"]

это здорово, но мне нужна функция max для объектов NSDate.Здесь http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSExpression_Class/Reference/NSExpression.html#//apple_ref/doc/uid/TP30001190 написано, что функция max () может получать только объекты, содержащие массивы, представляющие числа.

Есть ли какое-либо решение, чтобы использовать эту функцию для этого (переопределите некоторый метод, создайте некоторую категорию для NSPredicate)

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

ОК, это возможно, но это странно.Придется строить строку формата программно.В качестве альтернативы, мы могли бы построить все это путем создания отдельных NSExpression объектов, но это было бы намного больше кода (хотя, вероятно, безопаснее, но неважно).

NSDate *maxDate = ...; 
NSArray *arrayOfDates = ...; // an NSArray of NSDate objects

NSMutableArray *dateFormats = [NSMutableArray array];
for (NSDate *date in arrayOfDates) {
  NSString *format = [NSString stringWithFormat:@"%f", [date timeIntervalSinceReferenceDate]];
  [dateFormats addObject:format];
}

NSString *dateFormatString = [dateFormats componentsJoinedByString:@","];
NSString *format = [NSString stringWithFormat:@"CAST(max({%@}) = %%@, 'NSDate')", dateFormatString];

// format now looks like CAST(max({xxxx.xxxx, nnnn.nnnn, aaaa.aaaa, ....}), 'NSDate') = %@

NSPredicate *datePredicate = [NSPredicate predicateWithFormat:format, maxDate];

Трюк здесь заключается в использованииабсолютный временной интервал даты начиная с ссылочной даты в качестве аргументов функции max(), а затем преобразовать результат , который , обратно в дату с помощью CAST().Более подробную информацию о том, как использовать функцию CAST() с датами, можно найти в этом посте .

0 голосов
/ 28 сентября 2011

Это действительно хорошее решение, но не решайте мою проблему.Я получил что-то вроде этого:

NSPredicate* predicate = [NSPredicate predicateWithFormat: condition];
[predicate evaluateWithObject:nil substitutionVariables: currentForm];

И условие может быть:

max($widgetWhichReturnDate.result.result,$widgetWhichReturnDate.result) 

или

max($widgetWhichReturnInt.result,$widgetWhichReturnInt1.result)

, какой виджет используется здесь, зависит от веб-службы.Поэтому я не люблю использовать разные функции для Date и int (или в будущем, возможно, float, double и т. Д.)

...