构建谓词产生语法错误

Building Predicate Producing Syntax Error

我正在构建一个复杂的 NSPredicate,它根据许多变量而变化。似乎最有效的方法是将每个子句分别构建为一个字符串,将这些字符串组合成一个数组,将数组转换回字符串并使用 predicateWithFormat 将其读入谓词。它工作得很好,除了在我比较日期的情况下,我得到以下错误:

Unable to parse the format string "(canceled != 1)&&(starttime >=2016-12-18 13:50:41 +0000)"'

这是我构建此子句的行。

typePredClause = [NSString stringWithFormat:@"(starttime >=%@)",nowstr];

starttime 是实体中的 NSDate,这就是我得到 nowstr

的方式
   NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
             NSString *nowstr = [dateFormatter stringFromDate:[NSDate date]];

我知道只使用 predicateWithFormat 并将字符串排除在外是最理想的,但是谓词太复杂了,构建它是唯一的方法。

谁能建议如何解决这个问题?

作为参考,这是我组合所有子句的代码。

if (typePredClause.length > 0)
[predArr addObject:typePredClause];
NSString *predStr = [predArr componentsJoinedByString:@"&&"];
predicate = [NSPredicate predicateWithFormat:predStr];

如果 starttimeNSDate 属性,则不应从日期创建字符串。只需使用 NSDate.

而且您创建谓词的方法完全错误。不要使用一堆字符串来构建它。这样做:

NSPrediate *canceledClause = [NSPredicate predicateWithFormat:@"canceled != %d", someInt];
NSPredicate *startTimeClause = [NSPredicate predicateWithFormat:@"(starttime >= %@)", [NSDate date]];
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[ canceledClause, startTimeClause ]];