为了把它放在一个背景:
-copy
和-isEqual
是密切相关。两个讨论两个不同的对象是相同的。创建一个副本只是意味着创建第二个实例,该实例预计等于第一个实例。
在一个对象图中(它不依赖于你使用CD或不使用CD的事实)复制实例并不是微不足道的。这对深度意味着什么?如果你要求“深层复制”(达到哪个层次?),你会发现自己复制了整个图表。对于属性来说这是一个简单的决定(我希望CD可以自动为属性做这件事),但是你不能将它推广到关系上。
CD通过假定两个对象相同(如果它们具有相同的标识)来解决此问题。不同的对象永远不会相等。因此你不能复制它们。你的副本永远不会等于原点。这是荒谬的情况。对象图中的对象不存在完整副本(又称处理关系)。
对你的问题:
不要在副本中思考。在关系中思考。这两个列表(要过滤的列表和过滤的对象列表)应该根据关系构建。假设您有一个实体组,其中包含成员。成员有一个要过滤的属性。一个使用NSPredicate的简单示例。
// The existing list
NSManagedObject *group = …;
// The predicates used to filter. nFilter is /filter
NSPredicate *filter = …; // filters +hits
NSPredicate *nFilter = …; // filters -hits
// Get the complete (original list)
NSSet *members = [group objectForKey:@"members"];
// Get the +hit list and the -hit list
NSSet *filteredMembers = [members" filteredSetUsingPredicate:filter];
NSSet *nFilteredMembers = [members" filteredSetUsingPredicate:nFilter];
// Set the -hit list to the original object
[group setObject:nFilteredMembers forKey:@"members"];
// Set the +hit list to a new object
NSManagedObject *filteredGroup = …; // Create it as you need it
[filteredGroup setObject:filteredMembers for Key:@"members"];
您不必删除对象,因为您不想删除它们。你想要移动它们。所以就做吧。
请注意,新对象不一定与原始对象具有相同的实体类型。