【问题标题】:Form NSPredicate形成 NSPredicate
【发布时间】:2013-05-23 11:12:36
【问题描述】:

我对 NSPredicate 有疑问。想不出怎么写,也找不到类似的东西。 我有这个谓词:

[NSPredicate predicateWithFormat:@"followedBy.username like %@", username];

这将返回跟随给定用户的所有用户。我想扩展这个谓词,它还会在 NSSet 中返回带有 ids 的用户。

UserIDSetExample = @"1, 15, 14, 17, ..."

所以最后我希望这个谓词返回以下用户以及集合中具有 ids 的用户。

任何指导或帮助将不胜感激!!!提前致谢!

【问题讨论】:

  • “followedBy”是您的用户对象的属性吗?它是什么类型的?
  • @MarcinKuptel 它是一个属性,它是一个用户的 NSSet
  • 所以你的谓词返回所有名字与“用户名”中的内容匹配的关注者?
  • @MarcinKuptel 我有一个名为 master 的实体,它有一个属性用户名。谓词返回所有关注具有此给定用户名的用户的用户

标签: ios objective-c core-data nspredicate


【解决方案1】:

您的谓词应如下所示:

[NSPredicate predicateWithFormat:@"followedBy.id in %@ OR followedBy.username like %@", idsSet, username];

按 ID 匹配应该是 OR 中的第一个条件,因为搜索 ID(数字)是否在集合中可能比比较用户名的字符串要快

【讨论】:

  • 谢谢!那是有效的! [NSPredicate predicateWithFormat:@"identifier IN %@ OR followBy.username like %@",self.userSet, username];但是如果用户 id 在集合中并且用户正在关注我,那么它会返回两个用户,有没有办法确保不会发生这种情况?
  • 这很奇怪,它不会发生在我身上。如果用户的 ID 在集合中,则匹配 -> 完成。如果不是,则它会尝试按名称检查用户。我看不出这会发生在哪里。但是,从数组中删除重复项的快速解决方案是将结果数组(来自谓词)转换为 NSSet 并再次返回,如下所示:NSArray *uniqueArray = [[NSSet setWithArray:array] allObjects];
  • 我想过这个解决方案,但是如果谓词返回排序数组,转换为nsset再返回nsarray会丢失排序吗?
  • 是的,抱歉,我还没有考虑过排序。 NSSet 不保持秩序。但我仍然不明白为什么你会在结果中得到重复。唯一的原因可能是源过滤数组中的重复数据。顺便说一句:[array valueForKeyPath:@"@distinctUnionOfObjects"] 可以从数组中获取唯一值,但只能获取像 NSString 这样的具体属性,而不是所有对象。
  • 我对这些谓词有点迷茫,但似乎如果 id 在集合中,并且用户关注我,则返回两次。 distinctUnionOfObjects 是一种解决方案,但我想理解这一点并正确使用它。
【解决方案2】:

它可以是数组、集合或字典(正如@MikePollard 指出的那样),您可以将以下模式用于您的谓词:

[NSPredicate predicateWithFormat:@"id IN %@", idArray]

【讨论】:

  • 感谢您的评论,这是否只能使用数组?如果我这样写:[NSPredicate predicateWithFormat:@"id IN %@", idSet],它不会起作用?
  • 集合可以是数组、集合或字典——如果是字典,则使用其值。
猜你喜欢
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 2012-09-21
相关资源
最近更新 更多