2011-06-01 44 views
2

我想在后台线程和NSOperationQueue中使用核心数据。现在我想我为什么不应该创建一个拥有NSManagedObjectContext属性的所有Core Data堆栈的东西,然后让这个属性成为原子?在这种情况下,@synchronize是否可以防止竞态条件?

有一两件事我不知道@synchronize(self) {...}是这样的:假设我有一个被认为是线程安全的属性:

@property (retain) NSManagedObjectContext *moc; 

每天的NSOperation或线程访问的CoreDataTools类有这个MOC属性。他们访问这样的moc属性:

// Assume: Inside an NSOperation or new thread here... 
NSManagedObjectContext *moc = [[CoreDataTools sharedInstance] moc]; 

// Do a lot of things with moc. Add and remove 20 objects. 

这会有效吗?我不明白这个锁是否有效。只是在实际访问该属性的情况下?或者我可以安全地使用NSManagedObjectContext实例,直到后台线程的NSOperation或调用方法完成并返回?

我知道NSMangagedObjectContext有一个-lock方法。一般情况下我想知道这是否可行。

+1

@synchronized(个体经营){/ *锁是有效率的内线这里只* /} – Rayfleck 2011-06-01 13:56:19

+0

这是问题的答案。让它成为一个,我会接受它! :=) – 2011-06-01 14:29:50

回答

4
@synchronized(self) { /* lock is effective inside here only */ } 
+2

另外,如果您确实需要锁定某些内容,“@synchronized()”是最慢的方法:http://perpendiculo.us/?p=133。 – 2011-06-01 17:33:47

+1

@布拉德拉森 - 10秒内锁定1亿次。我不认为这太慢。 – rein 2012-08-12 15:54:59

2

不需要。每个线程都应该有自己的托管对象上下文。

More info: Concurrency with Core Data

+0

@synchronize的机制通常如何? – 2011-06-01 14:29:27

+0

这个主题非常宽泛,可以在这里整体解释,但总的来说@synchronize是递归锁定,如果这就是你想要的那样会降低性能。 NSCondition在这方面是更好的选择。 – TheBlack 2011-06-01 15:10:29