我遇到了 NSManagedObjectContext 的竞争条件。我正在尝试使用NSManagedObjectContext上的锁来防止这种情况的各种方法。使用dispatch_sync似乎是一个更好的方法,如apple所示。但是我无法弄清楚是否可以通过两个不同的线程来保存一个对象(在使用dispatch_sync执行的块下使用)不被访问。
以下是我想要问的更清晰的图片:
[[*Some Singleton class* instance].managedObjectContext executeFetchRequest:request error:&err];
// After fetching results do something in DB
假设上面的代码在使用dispatch_sync执行的块中传递,如下所示:
dispatch_sync(someConcurrentQueue, ^{
[[*Some Singleton class* instance].managedObjectContext executeFetchRequest:request error:&err];
// After fetching results do something in DB
});
任何其他线程都可以在此块完全执行之前访问[某些Singleton类实例] .managedObjectContext。
可以访问AFAIK。如果这是真的,那么在NSManagedObjectContext上应用锁定是防止这种竞争条件的唯一方法吗?
答案 0 :(得分:0)
一如既往:取决于
dispatch_sync
(它甚至更安全的堂兄dispatch_barrier_sync
)导致它被调用的队列同步执行该块。这样做会阻止线程。这使得一个案例可能是安全的:从同一个线程访问。在这种情况下您需要担心的是,您执行的任何读取都可能在块在队列上执行之前发生。相应地计划。
但这忽略了代码中的一个巨大缺陷。托管对象上下文应该从不在线程之间共享,甚至分派到与创建它们的线程不同的线程。您可以通过简单地生成子上下文来修复并发访问问题。