gpt4 book ai didi

ios - 在格式字符串之外使用 NSPredicate 的 SELF

转载 作者:行者123 更新时间:2023-12-01 18:32:57 26 4
gpt4 key购买 nike

我在 CoreData 存储上使用 fetchedResultsController,我想创建一个谓词,根据这个概念给我 fetchedObjects:

[NSPredicate predicateWithFormat:@"%i > 0", [self countForObject:SELF]]
countForObject 是一种方法,它根据我想成为 SELF 的参数 anObject 返回一个整数。
编辑
看来我应该为此使用 block 。我已经将一些代码粘合在一起,但是当我使用它时我的应用程序崩溃并且没有反馈:
    [NSPredicate predicateWithBlock:^BOOL(id object, NSDictionary *bindings){
return ([self countForObject:object] > 0);
}];

最佳答案

你的问题是在你使用 self并使用非特异性测试。

您似乎希望它引用谓词正在测试的托管对象,但它实际上会引用代码出现的运行时对象(可能是 tableview Controller 。)使用 block 并不能解决问题,因为“范围拖动”在其中 block 在调用它们的同一范围内运行。

所以,你的代码实际上是这样工作的:

[NSPredicate predicateWithFormat:@"%i > 0", [myTableViewController countForObject:aPresumedConstant]];

...和 block 代码有同样的问题。

您的测试是非特定的,因为您不针对托管对象的属性进行测试。相反,您为获取实体的所有托管对象创建一个真或假的测试。

即使您的 self引用返回了一个可用的值,它只会返回一个值。假设您的 countForObject:在单独的运行中分别返回 -1,0,1。在运行时,您的谓词将解决如下问题:
[NSPredicate predicateWithFormat:@"false", -1]; // -1<0 so %i>0 always resolves to false
[NSPredicate predicateWithFormat:@"false", 0]; // 0==0 so %i>0 always resolves to false
[NSPredicate predicateWithFormat:@"true", -1]; // 1>0 so %i>0 always resolves to true

在前两种情况下,提取将返回零个对象,而最后一种将返回提取实体的所有对象。

你可能见过 self在谓词中使用如下:
[NSPredicate predicateWithFormat:@"SELF == %@", anObject];

这里的区别在于 SELF出现在引号内,因此成为谓词发送给正在测试的对象的消息的一部分。谓词本质上说,“你的 SELF 键是否等于一个对象的 SELF 键?”由于每个对象都了解自己的 SELF 值,因此每个对象都可以返回单独的 true 或 false 作为响应。

如果您希望每个托管对象响应 countForObject 上的测试你需要制作 countForObject和托管对象的实体/类的属性/属性。通常,您会创建一个 transient 属性,该属性会在每次查询时计算一个值,但不会将其保存到存储中。

你会像这样使用它:
[NSPredicate predicateWithFormat:@"SELF == %@", anObject];

关于ios - 在格式字符串之外使用 NSPredicate 的 SELF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6284812/

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