创建将对象传递给实例方法的 NSPredicate

Posted

技术标签:

【中文标题】创建将对象传递给实例方法的 NSPredicate【英文标题】:Create NSPredicate that passes an object to an instance method 【发布时间】:2011-08-23 12:19:54 【问题描述】:

我创建了一个名为 TItem 的 NSManagedObject。对于该对象,我添加了一个辅助实例方法,如下所示:

- (BOOL) isItemForUser:(TUser *)user;

isItemForUser 将 TUser 对象中的各种属性与其自身进行比较,并根据比较结果返回一个 BOOL。

我想创建一个谓词,该谓词能够将 TUser 对象传递给该方法,以便我可以找到所有 TItem 对象,这些对象在传递给定对象的情况下返回 YES。本质上,我想做如下的事情:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"isItemForUser:%@ == YES",self.user];

上述语法显然不正确,但我正在寻找一种相同的精神。有什么想法吗?

谢谢!

【问题讨论】:

【参考方案1】:

我会探索在谓词中进行 isItemForUser 方法中所做的任何比较。也许简化您的数据模型以使比较更容易?例如,添加一些映射到用户并在创建对象时计算的新属性。这样比较就很简单了。

【讨论】:

这是一个有趣的想法。它确实打破了我正在寻找的一些封装。此方法将用户的性别和年龄与其自己的属性进行比较。 (例如,它基本上回答了这个问题:“这个 TItem 是否适合 30 岁以上的男性?”)所以我希望 TItem 本身使用这种方法来确定这一点。如果我要理解您,您建议只公开 TItem 的 forGenderforAge 属性,然后构建一个复合谓词来创建与 isItemForUser 当前评估的相同逻辑表达式?感谢您的建议!【参考方案2】:

FUNCTION 就是你要找的东西:

[NSPredicate predicateWithFormat:@"FUNCTION(SELF, 'isItemForUser:', %@) == YES", self.user]

但是有两点需要注意:

    isItemForUser: 必须返回 NSNumber,而不是 BOOL 我 99.9999% 确定这不会作为提取请求谓词的一部分起作用

【讨论】:

以上是关于创建将对象传递给实例方法的 NSPredicate的主要内容,如果未能解决你的问题,请参考以下文章

Java/Android - 在资源打开的情况下将对象传递给方法

在Kotlin中,如果将对象传递给类的新实例,然后更改某些属性,它是否会在原始对象中更改?

.NET Remoting,将对象传递给方法

创建/更新实体时,我应该将对象传递给业务逻辑还是对象值?

如何按值将对象传递给Angular2 +组件

尝试将对象传递给同一个模板类进行复制