2011-10-29 29 views
4

我有兩個線程在我的應用程序中運行。NSManagedObjectContext鎖定

  • 在主線程中,我更新實體中的鍵值或從核心數據獲取一些行。
  • 在後臺線程中,我從服務器下載數據。

但更新/加工過程中的核心數據上[managedObjectContext executeFetchRequest:request error:&error]

一些時間......我得到:

#0 0x34507c5c in semaphore_wait_signal_trap()
#1 0x34507f58 in semaphore_wait_signal()

#2 0x364d573a in pthread_mutex_lock() 
#3 0x35c91a2e in -[_PFLock lock]() 
#4 0x35c91a12 in -[NSPersistentStoreCoordinator lock]() 
#5 0x35c919e8 in -[NSManagedObjectContext(_NSInternalAdditions) lockObjectStore]() 
#6 0x35c90676 in -[NSManagedObjectContext executeFetchRequest:error:]() 

如何進行的NSManagedObjectContext被鎖定?我能爲此做些什麼?

+0

請接受適當的答案給你以前的問題,這可能會讓你在這裏得到更好的答案。 – tilo

+0

我也有同樣的問題。你修好了嗎? –

+0

是的。確保同一個managedobject上下文不會在多個線程上被訪問。請看看接受的答案 – Ritika

回答

3

鎖是正常操作的一部分,不是問題的根源。

很可能,您在管理單獨線程上下文時遇到問題。確保爲每個線程使用不同的上下文,並確保不在線程之間傳遞管理對象。確保在嘗試訪問另一個線程上的更改之前合併上下文。

+0

因爲我只在主線程上訪問上下文.so可能是單線程上下文管理問題的來源?我還合併了對上下文執行的更改 – Ritika

+0

鎖提示同時訪問商店的多個線程或至少多個上下文。鎖是一個'posix線程互斥鎖',所以你有多次訪問商店。 – TechZen

+0

你說對商店的多重訪問 - 你是指被managedObjectContext使用的商店,或者只是managedObjectContext - 我認爲不同線程上的兩個不同的managedObjectContexts可能有同一個商店......(我問只是因爲我有這個相同的問題,並且看不到我將在多個線程上訪問相同上下文的位置) – Rupert

1

在多線程應用程序中掌握CoreData可能很困難。確保爲每個使用CoreData的線程創建一個新的NSManagedObjectContext。 MOC必須在使用它的線程中創建。 MOC本身不是線程安全的。 CoreData不會爲你鎖定它。如果您爲每個線程使用新的MOC,則不必執行鎖定。 在您的堆棧中,您可以看到NSPersistentStoreCoordinator已被鎖定(不是MOC)。 CoreData執行此操作,以便只有一個MOC可以同時訪問NSPersistentStoreCoordinator。

+0

我只在我的主線程上使用了MOC而不是後臺線程。那麼爲什麼NSPersistentStoreCoordinator被鎖定? – Ritika

+0

我在我的回答中說過。它保證原子訪問它。如果它不能鎖定它,這意味着另一個線程正在訪問它,所以當前線程等待,直到它再次釋放。 – Felix

+0

我有類似的問題。但是當它暫停時,它看起來像只有一個線程(去__psynch_mutexwait的線程)正在使用它(com.apple.main-thread)。我怎樣才能找出問題所在? – Gujamin