Iphone 用新属性替换核心数据属性以避免僵尸对象

Iphone 用新属性替换核心数据属性以避免僵尸对象,iphone,ios,core-data,nsmanagedobject,nsset,Iphone,Ios,Core Data,Nsmanagedobject,Nsset,我有两个名为Event和Image的NSManagedObject。事件类有一个名为images的属性(也有反向关系),该属性由包含类Image对象的NSSet组成 当从服务器更新事件时,我只想用一个新的图像NSSet替换旧的图像NSSet,它也可以包含以前存在的图像对象或新的图像对象。我所做的是: event.images = [NSSet setWithArray:imagesParser_.imagesArray]; 这满足了我的目的,但我担心的是,仍然有一些属于旧NSSet的图像对象,

我有两个名为Event和Image的NSManagedObject。事件类有一个名为images的属性(也有反向关系),该属性由包含类Image对象的NSSet组成

当从服务器更新事件时,我只想用一个新的图像NSSet替换旧的图像NSSet,它也可以包含以前存在的图像对象或新的图像对象。我所做的是:

event.images = [NSSet setWithArray:imagesParser_.imagesArray];
这满足了我的目的,但我担心的是,仍然有一些属于旧NSSet的图像对象,现在没有任何与任何事件的链接,可能永远留在数据库中。我认为在更新后进行清理(在数据库中查找没有事件的图像对象并将其从数据库中删除)可能会解决这个问题,但我不知道它的效率有多高


非常感谢。

使用coredata删除对象非常快。我会亲自检查并删除与我的活动相关的所有对象,然后添加新对象

您也可以采取您的方法,不经常地在没有任何事件的情况下浏览并删除所有图像。只有在将来,图像可以在没有事件的情况下存在(例如,您创建了一种需要照片的新数据类型)时,这才会成为问题。它实际上不是时间或内存密集型的


保持数据库干净是个好主意,否则将来可能会遇到麻烦。你现在投入的任何努力都会在将来对你有益。如果您不再需要对象,请以某种方式将其删除。

使用coredata删除对象非常快。我会亲自检查并删除与我的活动相关的所有对象,然后添加新对象

您也可以采取您的方法,不经常地在没有任何事件的情况下浏览并删除所有图像。只有在将来,图像可以在没有事件的情况下存在(例如,您创建了一种需要照片的新数据类型)时,这才会成为问题。它实际上不是时间或内存密集型的


保持数据库干净是个好主意,否则将来可能会遇到麻烦。你现在投入的任何努力都会在将来对你有益。如果不再需要对象,请以某种方式将其删除。

如果在核心数据编辑器中创建所需的关系,则可以确保尝试创建孤立实体将导致错误。如果在核心数据编辑器中创建所需的关系,您可以确保尝试创建孤立实体将导致错误。谢谢Firo。我发现删除所有对象然后添加新对象的唯一问题是,一些旧图像可能仍然是新NSSet的一部分。删除一个图像,然后用相同的Id创建它,这不是浪费时间吗?您可以将谓词与fetch请求相关联,该请求将只获取事件关系为零的图像对象。从技术上讲,在您提供的解决方案中,您不会重用任何图像(除非_imagesArray手动处理)因为coredata在比较实体时不使用属性(或者至少不使用您提供的属性)。因此,与您的解决方案相比,不,您可能不会注意到任何差异。有很多方法可以尝试改变这一点,使其更加有效,但这需要一些额外的实现。谢谢Firo。我发现删除所有对象然后添加新对象的唯一问题是,一些旧图像可能仍然是新NSSet的一部分。删除一个图像,然后用相同的Id创建它,这不是浪费时间吗?您可以将谓词与fetch请求相关联,该请求将只获取事件关系为零的图像对象。从技术上讲,在您提供的解决方案中,您不会重用任何图像(除非_imagesArray手动处理)因为coredata在比较实体时不使用属性(或者至少不使用您提供的属性)。因此,与您的解决方案相比,不,您可能不会注意到任何差异。有一些方法可以尝试改变这一点,使其更加有效,但这需要一些额外的实现。