1

我有一个NSManagedObjectContext的竞争条件。我正在尝试使用 NSManagedObjectContext 上的锁定来防止这种情况发生的各种方法。正如苹果建议的那样,使用 dispatch_sync 似乎是一种更好的方法。但是我无法弄清楚是否可以保存一个对象(在使用 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
});

在此块完全执行之前,任何其他线程是否可以访问 [ Some Singleton class instance].managedObjectContext。

AFAIK 可以访问它。如果这是真的,那么在 NSManagedObjectContext 上应用锁定是防止这种竞争条件的唯一方法吗?

4

1 回答 1

0

一如既往:这取决于

dispatch_sync(甚至更安全的表亲dispatch_barrier_sync)导致调用它的队列同步执行块。在这样做时,他们阻塞了线程。这使得一种情况可能是安全的:从同一个线程访问。在这种情况下,您必须担心的是,您所做的任何读取都可能发生在队列上执行块之前。相应地计划。

但这忽略了代码中的一个巨大缺陷。托管对象上下文不应该线程共享,甚至不应该分派到与创建它们的线程不同的线程。您可以通过简单地生成子上下文来解决并发访问问题。

于 2013-06-14T03:59:27.773 回答