【发布时间】:2015-09-13 23:12:59
【问题描述】:
我有一个包含数千个实体的核心数据层,不断与服务器同步。同步过程使用获取请求来检查 deleted_at 以进行软删除。在 performBlockAndWait 调用中有一个执行保存操作的上下文。关系映射由 RestKit 库处理。
CoreDataEntity 类是 NSManagedObject 的子类,也是我们所有不同核心数据对象类的超类。它具有我们所有实体都继承的一些属性,例如 deleted_at、entity_id 以及所有样板的 fetch 和 sync 方法。
我的问题是一些 fetch 请求在修改对象后似乎返回不一致的结果。例如删除一个对象后(将deleted_at设置为当前日期):
[CoreDataEntity fetchEntitiesWithPredicate:[NSPredicate predicateWithFormat:@"deleted_at==nil"]];
使用 deleted_at == [NSDate today] 返回结果
我已经通过另外循环遍历结果并删除设置了 deleted_at 的实体成功地解决了此问题,但是我无法解决相反的问题:
[CoreDataEntity fetchEntitiesWithPredicate:[NSPredicate predicateWithFormat:@"deleted_at!=nil"]];
在相同条件下返回一个空数组,阻止服务器同步成功。
我已确认已在对象上设置了 deleted_at,并且上下文保存成功。我只是不明白在哪里重置导致过时结果的缓存?
感谢您的帮助!
编辑:添加更多信息,似乎一旦这些对象之一损坏,使其注册的唯一方法是再次修改值。这可能是某种核心数据索引在修改值时没有更新吗?
更新:RestKit https://github.com/RestKit/RestKit/issues/2218 似乎有问题
【问题讨论】:
-
你检查过你的上下文吗?确保在访问它们时保存在合并到主上下文的适当上下文中。您可能正在执行操作并且可能未正确同步您的上下文。使用上面提供的代码,考虑到它可能有很多东西,真的没有什么可做的。
-
只有一个上下文。我将把它添加到问题中。谢谢!
-
您可以将您的
CoreDataEntity的详细信息添加到您的帖子中吗?加上performBlockAndWait代码。 -
我不知道您是否在自己的时间里发现了这个问题,但我们肯定需要更多代码来确定所指出的问题。你能设置一个带有数据模型和核心数据堆栈的虚拟项目来复制这个问题吗?
-
非常断断续续。我会尝试这样做。
标签: ios core-data restkit nspredicate nsfetchrequest