所以我在我的iOS应用程序中使用了MagicalRecord并遇到了一个非常奇怪的问题。我正在使用以下电话:
[MagicalRecord saveUsingCurrentThreadContextWithBlockAndWait:^(NSManagedObjectContext *localContext) {
/* look up object in localContext and change property value */ }];
以及稍后使用
检索新值(在主线程上)[ObjectName MR_findAll].
然而,大约1/3的时间,它报告了旧的价值!好像Core Data正在某个地方缓存旧版本的内存,我“有时”得到它而其他时候没有。
答案 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;
现在为什么儿童语境没有得到更新,我不知道。但是一旦我这样做,一切都会再次发挥作用。