2014-02-24 39 views
0

我有一个NSMutableArray与NSManagedObjects,我从数据库中拉回来。我想要做的是根据单个对象属性过滤出数组中的某些对象。通过过滤我的意思是从数组中删除。问题是,当做一个浅拷贝并从数组中移除一个对象时,最终会从我从中复制的原始数组中移除NSManagedObject。我查了几种不同的方法来应用深层复制,以便可以从第二个数组中过滤掉对象而不影响第一个数组。下面是我使用这样做代码:NSManagedObjects深拷贝NSMutableArray

NSMutableArray *copyOfChestExercises = [[NSMutableArray alloc]initWithArray:_chestExercises  copyItems:YES]; 

的问题是,我得到以下异常:

[Exercise copyWithZone:]: unrecognized selector sent to instance 0x15679f20' 

试图做副本的时候。我读过几篇文章,指出我需要一个copyWithZone实现来做到这一点,并在界面中。我还读了一些帖子,声称NSManagedObjects不能以我想要做的方式复制。如果任何人有关于如何做到这一点的提示或建议,或者如果我不这样做,我会非常感激。

回答

0

为了把它放在一个背景:

-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"]; 

您不必删除对象,因为您不想删除它们。你想要移动它们。所以就做吧。

请注意,新对象不一定与原始对象具有相同的实体类型。