gpt4 book ai didi

objective-c - 核心数据 NSPredicate "deleted == NO"没有按预期工作

转载 作者:行者123 更新时间:2023-12-05 09:24:05 25 4
gpt4 key购买 nike

我在父子上下文中使用 UIManagedDocument。

在我的 child 上下文中,我执行以下操作

代码1

NSSet *results = [self.event.memberships filteredSetUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

return ([[evaluatedObject deleted] boolValue] == NO);

}]];

以上代码返回预期结果(仅针对事件未删除的成员)。

代码2

但是这段代码没有。它获取所有记录。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"deleted == NO"];
NSSet *results = [self.event.memberships filteredSetUsingPredicate:predicate];

看起来很困惑。两者应该返回相同的结果,但是 predicateWithBlock 返回正确的结果,而 predicateWithFormat 返回所有记录。

使用 predicateWithBlock 而不是 predicateWithFormat 的优缺点是什么?

最佳答案

问题是您已经为您的实体定义了一个属性 deleted。这与 NSManagedObjectisDeleted 方法冲突,因此您应该重命名该属性。

以下“实验”表明,如果您将属性称为“已删除”(c 是具有自定义 deleted 属性的托管对象),会发生奇怪的事情:

// Set custom "deleted" property to YES:
c.deleted = @YES;

// Use the property, as your Code 1
NSLog(@"%@", [c deleted]);
// Output: 1

// Use Key-Value Coding, as your Code 2
NSLog(@"%@", [c valueForKey:@"deleted"]);
// Output: 0

// Now really delete the object and try again:
[context deleteObject:c];
NSLog(@"%@", [c valueForKey:@"deleted"]);
// Output: 1

您的“代码 1”指的是属性,因此它返回预期的结果。 “代码2”使用键值编码,[c valueForKey:@"deleted"]如果对象返回YES实际上已经从上下文中删除了!

因此重命名该属性应该可以解决您的问题。不幸的是编译器没有如果属性名称与内置方法冲突,则发出警告。

关于objective-c - 核心数据 NSPredicate "deleted == NO"没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16000242/

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