CoreData 多线程

Posted

技术标签:

【中文标题】CoreData 多线程【英文标题】:CoreData Multi-Threaded 【发布时间】:2016-04-12 14:50:35 【问题描述】:

我在多线程环境中使用 CoreData 时遇到问题。

我有一个 RestKit 设置,这意味着有一个 persistentManagedObjectContext(私有),我创建了一个子上下文(self.autoSyncMOC,也是私有的)。我没有触及 RestKit(主线程)的 mainManagedObjectContext,它是persistentMOC(我的autoSyncMOC 的兄弟)的子代。

@property (nonatomic, strong) NSManagedObjectContext *autoSyncMOC;

这是引发 Multithreading_Violation_AllThatIsLeftToUsIsHonor 异常的代码:

self.autoSyncMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
self.autoSyncMOC = [RKObjectManager sharedManager].managedObjectStore.persistentStoreManagedObjectContext;

[self.autoSyncMOC performBlockAndWait:^

    //do normal fetch
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:...];
    fetchRequest.predicate =[NSPredicate...
    NSArray *result = [self.autoSyncMOC executeFetchRequest:fetchRequest error:nil];

    //do stuff with fetched objects (i.e. set a property) 
    for (DownloadableItem *item in result) 
        item.checksumDownload = @"test";
    

    //save context       
    [self.autoSyncMOC save:...]; 
];

这里有什么问题?我想我仍然不明白这些概念。

我知道需要更多代码和上下文才能给出正确答案。我只想知道我的代码是否有效。

谢谢!

【问题讨论】:

我刚刚做了另一个让我感到困惑的测试:当我将上下文保存在属性中时,代码会抛出异常。如果我只是在我的方法中创建它,一切都会按预期工作。有人可以解释一下吗? 你把它保存到一个属性是什么意思?您是在重新创建它而不是将其存储在静态属性中吗? 我将它保存在一个静态属性中。在单例类中只创建一次。 您是否在此块中从主线程(或其他)NSManagedObject 访问任何属性,例如在创建谓词或获取请求时? autoSyncMOC 是如何创建的?请显示更多代码。 刚刚添加了一些代码。我没有访问我的块中的任何 NSManagedObject。 【参考方案1】:

看起来这是一个错误。不幸的是,仍未解决:https://forums.developer.apple.com/thread/19408

【讨论】:

以上是关于CoreData 多线程的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 多线程死锁

CoreData 多线程删除

同时使用 CoreData、多线程和绑定

CoreData和SQLite多线程访问时的线程安全问题

CoreData 多线程正在生成随机崩溃

在多线程上下文中,在托管对象上设置属性时,CoreData 阻塞