gpt4 book ai didi

objective-c - 将对象与同一集合中的其他对象进行比较的谓词

转载 作者:行者123 更新时间:2023-11-28 22:45:58 25 4
gpt4 key购买 nike

我有一个日历周期的 NSArray,它由 NSManagedObjects 组成,其建模如下图所示:

CoreDataModel

具有以下示例内容:

endMonth = 9;
endYear = 2012;
length = 3;
...

我正在尝试做的事情:

我正在尝试构建一个谓词,该谓词仅返回那些存在一年前等效期间的日历期间。示例:仅当数组中存在句点2011, 9, 3 时,才返回句点2012, 9, 3(年、月、长)作为结果。谓词需要将每个日历周期与数组中的每个日历周期进行比较。

这是我试过的谓词:

predicate = [NSPredicate predicateWithFormat:
@"SUBQUERY(SELF, $x, $x.endYear == endYear - 1 "
"AND $x.endMonth == endMonth AND $x.length = length).@count > 0"];

问题:

但是,使用此谓词运行我的应用会导致运行时崩溃并显示错误消息:NSInternalInconsistencyException',原因:“无法使用非集合对象执行集合评估。”

我的谓词有什么问题,我需要如何正确指定它?

谢谢!

最佳答案

首先,解决您看到的错误。这是您的谓词:

[NSPredicate predicateWithFormat:@"SUBQUERY(SELF, $x, $x.endYear == endYear - 1 "
"AND $x.endMonth == endMonth AND $x.length = length).@count > 0"]

SUBQUERY 表达式的第一个参数是 SUBQUERY 将迭代的集合。因此,您期望 SELF 计算为 NSArrayNSSet。但是,您在子查询谓词中使用键路径 endYearendMonthlength 似乎表明您期望 SELF 来评估 CalendarPeriod。因此,SELF 是一个集合(endYearendMonthlength 是该集合的无效键路径) ,或者 SELF 是一个 CalendarPeriod(因此不能用作 SUBQUERY 的集合。根据您的错误,它似乎是后者。

如果我们把你的问题写出来(不使用 NSPredicate),我们可能会得到这样的结果:

NSArray *calendarPeriods = ...;
for (CalendarPeriod *period in calendarPeriods) {
for (CalendarPeriod *otherPeriod in calendarPeriods) {
if ([otherPeriod endYear] == [period endYear] - 1 && [otherPeriod endMonth] == [period endMonth] && [otherPeriod length] == [period length]) {
return YES;
}
}
}
return NO;

那么,如何复制这个...

您的初步尝试似乎还不错。我认为唯一需要做的改变是,您应该使用 %@,而不是 SELF 作为 SUBQUERY 的第一个参数,以及那里的 calendarPeriods 集合中的替代项。或者,如果您将其作为 NSFetchRequest 的谓词执行,您可以尝试使用 FETCH() 表达式来获取每个 CalendarPeriod 对象.

顺便说一句,如果你走这条路,你会看到非常糟糕的表现。这是有保证的 O(N2),您可以做得更好。例如,如果您将每个 CalendarPeriod 提取到内存中,然后将它们插入到由 endYear 组合键控的 NSDictionary 中endMonthlength,那么你可以将它减少到 O(N) 时间。

关于objective-c - 将对象与同一集合中的其他对象进行比较的谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13220298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com