我遇到了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创建一些类别)
提前致谢。
答案 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等)