0

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

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

稍后使用检索该新值(都在主线程上)

[ObjectName MR_findAll]. 

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

4

2 回答 2

1

这看起来像是主仓库中没有的分叉方法。因此,我不能保证该方法甚至会起作用。很可能这是您看到的线程问题,这就是不推荐使用 contextForCurrentThread 方法的原因。

使用类似的方法可能会更好

[localContext saveToPersistentStoreAndWait:^{ /* called after save */ }];

或者

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext){ /* make your changes here*/}];
于 2013-11-11T03:13:15.350 回答
0

结果是不同线程的MagicalRecord其他缓存,即使父级正在保存,这些子级也没有得到更新。MOCsMOCsMOC

所以在 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;

现在至于为什么子上下文没有得到更新,我不知道。但是一旦我这样做了,一切都会再次起作用。

于 2013-11-11T03:55:43.790 回答