NSPredicate太多的论点。很难读懂它

时间:2014-03-20 21:34:31

标签: ios nspredicate

我刚遇到一些与清晰代码相关的问题。我在项目的许多模块中使用谓词。当我处理核心数据时,NSPredicates对于检索过滤对象非常有帮助。

但是,对于逻辑而言,这种预测是有益的,但是当我使用它时,它不能用于代码可读性。

让我们看一下这个例子:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                              @"(ANY option.playerzoneID == %d) \
                              AND (ANY option.gameId == %@) \
                              AND (team.teamID == %@) \
                              AND (league.leagueID == %@) \",
                              zoneIdType,
                              SELECTED_GAME.gameID,
                              SELECTED_TEAM.teamID,
                              SELECTED_LEAGUE.leagueID];

当我查看这个谓词时,即使我在一周前写过这个谓词,我对这个结构也很困惑。

有关如何使此代码更具可读性的任何建议吗?

我认为这样的事情会更好:

[predicate setParametr:@"gameID == %@", SELECTED_GAME.gameID];
[predicate setParametr:@"league.leagueID == %@", SELECTED_LEAGUE.leagueID];

1 个答案:

答案 0 :(得分:3)

您可以浏览以下内容:

+ (NSPredicate *)andPredicateWithSubpredicates:(NSArray *)subpredicates
+ (NSPredicate *)orPredicateWithSubpredicates:(NSArray *)subpredicates
+ (NSPredicate *)notPredicateWithSubpredicate:(NSArray *)subpredicate

有了这个,您实际上可以形成短谓词并将它们与数组连接在一起。所以,你并没有完全得到你想要的东西,但是它几乎可以拍摄。

NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"(ANY option.playerzoneID == %d)", zoneIdType];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"(ANY option.gameId == %d)", SELECTED_GAME.gameID];
NSPredicate *predicate3 = [NSPredicate predicateWithFormat:@"(ANY team.teamID == %@)", SELECTED_TEAM.teamID];

NSCompoundPredicate *compoundANDPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[predicate1, predicate2, predicate3]];

在此处详细了解这些内容:http://nshipster.com/nspredicate/

编辑:使用OR Predicates和AND Predicates:


让我们假设:您将此谓词添加为OR:

NSPredicate *predicate4 = [NSPredicate predicateWithFormat:@"(ANY team.teamName == %@)", SELECTED_TEAM.teamName];

因此,您可以将AND和OR谓词分组为一个复合谓词(compoundANDPredicate,如上所示),然后使用

+ (NSPredicate *)orPredicateWithSubpredicates:(NSArray *)subpredicates

所以它变成了:

[NSCompoundPredicate orPredicateWithSubpredicates:@[compoundANDPredicate, predicate4]];