2013-01-19 98 views
6

是否有一種安全的方式來刪除應用程序中的持久性存儲(並創建一個新的),其中的其他線程正在使用與要刪除的存儲關聯的NSManagedObjectContext?我試圖鎖定NSPersistentStoreCoordinator並在操作結束後將其解鎖,但這並沒有幫助 - 我所有的嘗試都導致了死鎖。它總是發生在這條線(主線程上執行):核心數據 - 移除持久性存儲時發生死鎖

[self.persistentStoreCoordinator removePersistentStore: store error: &error]; 
+0

你可以發佈相關線程的堆棧跟蹤圖像嗎? –

+0

你在使用線程限制或隊列限制嗎?你正在使用父子上下文嗎? – quellish

+0

你首先應該確定**你爲什麼要這麼做,然後看看你是否可以想出另一種解決方案。在大多數情況下,你最好先拆除整個堆棧,並確保託管對象的任何東西都聽取有關堆棧消失的通知,以便釋放它們的引用。你所要做的就像把摩天大樓的一樓扯下來,並期待一切都保持原樣。 –

回答

2

我沒有試過,但是從docs on mocsetPersistentStoreCoordinator: ...

協調提供了管理對象模型和處理 持久性。請注意,多個上下文可以共享協調器。

如果協調器爲零,則此方法引發異常。如果你想 「斷開」從它的持久存儲協調上下文,你 應該簡單地將所有強引用上下文爲零和 允許其正常釋放。

這表明安全地清除PSC是先有一個MOC釋放它(零出參考它在ARC)每一個線程,然後執行removePersistentStore:

+0

所以你認爲這個問題存在,因爲有一個流氓背景需要被釋放? –

+0

是的,我猜想不止一個,等着彼此解鎖。 – danh

+1

調試建議:創建一個「NSManagedObjectContext」的自定義子類。讓它用一個從未保存的'NSValue'到'setPersistentStoreCoordinator:...','dealloc'等持久存儲協調器的映射來更新一個全局字典,並且可能還有一些其他信息可以正確識別上下文。爲了識別流氓,檢查字典。 – Tommy

1

我會嘗試使用此處介紹(第父/子上下文的方法): Multi-Context CoreData

基本上,您的PSC只有一個與其關聯的MOC(父母MOC)。其他線程擁有自己的MOC,其parentContext設置爲主MOC(與PSC關聯的MOC)。

那麼你可以嘗試這樣的事:

// Save each child MOC 
for (NSManagedObjectContext *moc in self.someChildMOCs) 
{ 
    [moc performBlockAndWait:^{ 

     // push to parent 
     NSError *error; 
     NSAssert([moc save:&error]); 
     moc.parentContext = nil; 
    }]; 
} 

// Save parent MOC to disk 
[self.mainMOC performBlockAndWait:^{ 
    NSError *error; 
    NSAssert([mainMOC save:&error]); 
}]; 

[self.persistentStoreCoordinator removePersistentStore:store error:&error]; 
mainMOC.persistentStoreCoordinator = nil; 
1

是否有刪除的持久性存儲的安全方式(並創建一個新的)應用程序中,而其他線程使用的NSManagedObjectContext的關聯該商店被刪除?

它應該是安全的如果你能保證沒有現場管理的對象將試圖訪問持久性存儲。這部分至關重要:您必須確保沒有任何類型的實時對象已從舊持久性存儲中加載或以其他方式關聯。

可通過重新設置每個被管理對象上下文做到這一點:

[managedObjectContext performBlockAndWait:^{ 
    [managedObjectContext reset]; 
}]; 

一旦你做到了這一點爲管理對象上下文,可以刪除持久性存儲。

請注意,如果您有任何託管對象是從這些上下文中獲取的,則必須立即將它們處理掉,而無需讀取或寫入屬性值或以任何方式使用它們。由於各種原因,這些對象可能需要使用上下文,但在調用reset後,上下文不再瞭解它們。立即擺脫它們(理想情況下甚至在調用重置之前),因爲它們是在您觸摸它們時等待炸燬應用程序的時間炸彈。

相關問題