NSPredicate for max(arrayOfNSDates)

时间:2011-09-27 08:42:23

标签: iphone nsdate nspredicate max

我遇到了NSPredicate的问题。

我得到了一些引擎,其中谓词是根据来自Web服务的定义构建的。

我使用那样的东西:

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

很棒,但我需要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 个答案:

答案 0 :(得分:1)

好的,这是可能的,但这很奇怪。我们必须以编程方式构建格式字符串。或者,我们可以通过创建单独的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()函数与日期结合使用的更多信息,请参见in this blog post

答案 1 :(得分:0)

这个解决方案真的很好,但不能解决我的问题。 我有这样的事情:

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

条件可以是:

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

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

这里使用的小部件取决于webservice。 所以我不喜欢为Date和int使用不同的函数(或者将来可能使用float,double等)