核心数据报告旧值?

时间:2013-11-11 02:28:46

标签: ios magicalrecord

所以我在我的iOS应用程序中使用了MagicalRecord并遇到了一个非常奇怪的问题。我正在使用以下电话:

[MagicalRecord saveUsingCurrentThreadContextWithBlockAndWait:^(NSManagedObjectContext *localContext) {
/* look up object in localContext and change property value */ }];

以及稍后使用

检索新值(在主线程上)
[ObjectName MR_findAll]. 

然而,大约1/3的时间,它报告了旧的价值!好像Core Data正在某个地方缓存旧版本的内存,我“有时”得到它而其他时候没有。

2 个答案:

答案 0 :(得分:1)

这看起来像是不在主要仓库中的分叉方法。因此,我不能保证该方法甚至可以工作。很可能这是你遇到的线程问题,这就是为什么不推荐使用contextForCurrentThread方法。

使用像

这样的方法可能会有更好的运气
[localContext saveToPersistentStoreAndWait:^{ /* called after save */ }];

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext){ /* make your changes here*/}];

答案 1 :(得分:0)

为不同的主题提供MagicalRecord个其他MOCs缓存,即使父MOCs正在保存,这些小孩MOC也没有得到更新。

所以     NSManagedObjectContext(MagicalThreading)改变了这一点:

NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary];
NSManagedObjectContext *threadContext = [threadDict objectForKey:kMagicalRecordManagedObjectContextKey];

if (threadContext == nil)
{
  threadContext = [self MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]];
  [threadDict setObject:threadContext forKey:kMagicalRecordManagedObjectContextKey];
}
return threadContext;

对此:

NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary];
NSManagedObjectContext *threadContext = [threadDict objectForKey:kMagicalRecordManagedObjectContextKey];
threadContext = [self MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]];
[threadDict setObject:threadContext forKey:kMagicalRecordManagedObjectContextKey];

return threadContext;

现在为什么儿童语境没有得到更新,我不知道。但是一旦我这样做,一切都会再次发挥作用。