创建将对象传递给实例方法的 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 的forGender
和 forAge
属性,然后构建一个复合谓词来创建与 isItemForUser
当前评估的相同逻辑表达式?感谢您的建议!【参考方案2】:
FUNCTION
就是你要找的东西:
[NSPredicate predicateWithFormat:@"FUNCTION(SELF, 'isItemForUser:', %@) == YES", self.user]
但是有两点需要注意:
isItemForUser:
必须返回 NSNumber
,而不是 BOOL
我 99.9999% 确定这不会作为提取请求谓词的一部分起作用
【讨论】:
以上是关于创建将对象传递给实例方法的 NSPredicate的主要内容,如果未能解决你的问题,请参考以下文章
Java/Android - 在资源打开的情况下将对象传递给方法