2011-06-01 46 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