NSManagedObjects 的深拷贝 NSMutableArray
Posted
技术标签:
【中文标题】NSManagedObjects 的深拷贝 NSMutableArray【英文标题】:Deep Copy NSMutableArray of NSManagedObjects 【发布时间】:2014-02-24 02:42:31 【问题描述】:我有一个带有 NSManagedObjects 的 NSMutableArray,我从数据库中提取了它。我要做的是根据单个对象属性过滤掉数组中的某些对象。过滤掉我的意思是从数组中删除。问题是,当做一个浅拷贝并从 arrayTwo 中删除一个对象时,最终会从我复制的原始数组中删除 NSManagedObject 。我查找了几种不同的方法来应用深拷贝,这样我就可以从第二个数组中过滤掉对象,而不会影响第一个数组。这是我用来执行此操作的代码:
NSMutableArray *copyOfChestExercises = [[NSMutableArray alloc]initWithArray:_chestExercises copyItems:YES];
问题是我得到以下异常:
[Exercise copyWithZone:]: unrecognized selector sent to instance 0x15679f20'
尝试复制时。我已经阅读了一些帖子,指出我需要一个 copyWithZone 实现来执行此操作并在接口中具有。我还阅读了一些帖子,声称不能以我尝试的方式复制 NSManagedObjects。如果有人有关于如何做到这一点的提示或建议,或者如果不能按照我的方式完成,将不胜感激。
【问题讨论】:
【参考方案1】:把它放在一个上下文中:
-copy
和 -isEqual
密切相关。两者都讨论两个不同的对象是相同的。创建副本只是意味着创建第二个实例,预计与第一个实例相同。
在对象图中(它不取决于您是否使用 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"];
您不必删除对象,因为您不想删除它们。你想移动它们。所以就去做吧。
请注意,新对象不一定与原始对象的实体类型相同。
【讨论】:
以上是关于NSManagedObjects 的深拷贝 NSMutableArray的主要内容,如果未能解决你的问题,请参考以下文章