我正在将 UIManagedDocument 与父子上下文一起使用。
在我的孩子的背景下,我做了以下事情
Code 1
NSSet *results = [self.event.memberships filteredSetUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
return ([[evaluatedObject deleted] boolValue] == NO);
}]];
上面的代码返回预期结果(仅事件的未删除成员)。
Code 2
但这段代码没有。它获取所有记录。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"deleted == NO"];
NSSet *results = [self.event.memberships filteredSetUsingPredicate:predicate];
看起来很混乱。两者都应该返回相同的结果,但是predicateWithBlock
返回正确的结果,其中predicateWithFormat
返回所有记录。
使用有什么优点和缺点predicateWithBlock
代替predicateWithFormat
?
问题是你定义了一个属性deleted
为您的实体。这与isDeleted
的方法NSManagedObject
,所以您应该重命名该属性。
以下“实验”表明,如果您将属性称为“已删除”,则会发生奇怪的事情(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
如果物体
实际上已经从上下文中删除了!
因此,重命名该属性应该可以解决您的问题。不幸的是编译器没有
如果属性名称与内置方法冲突,则发出警告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)