0

我在我的NSManagedObjectContexts上使用performBlock,以便我的更改發生在給定上下文的右側隊列中。我的問題是 - 如果我在performBlock之內進行了很多更改和調用方法 - 是否有一種簡單的方法可以確保我使用正確的上下文中的對象。核心數據 - 從NSManagedObjectContext調用的共享代碼peformBlock:

實施例:

我有一個activeAccount IVAR(在主隊列中創建),其用於在應用程序的當前帳戶NSMangedObject。我有一些實例方法使用activeAccount對象執行某些任務 - 獲取數據,設置數據。所以我的問題是,如果我在背景NSManagedObjectContext上做了些什麼,並且我調用了其中一種共享方法 - 是否有一種我可以使用的模式,以便在我知道的這些方法中使用當前的activeAccount iVar或獲取新的。此外,如果我需要做一些事情需要NSManagedObjectContext - 我怎麼知道哪一個得到/使用。

我知道使用哪個NSManagedObjectContext的方法是我有一個方法,檢查它是否在當前線程上運行 - 然後知道返回主線程的上下文或後臺線程的上下文。此外,如果我在後臺線程上,我是否允許讀取位於主線程上的activeAccount的對象ID,以便我可以在後臺線程上獲取它的副本?提前致謝。

回答

0

Brian,

線程限制可能是一個棘手的命題來維護。您需要維護的關鍵是在適當的MOC中使用對象。由於每個託管對象都保持與其主機MOC及其對象ID的鏈接,因此確實很容易。例如:

NSManagedObjectContext *newMOC = NSManagedObjectContext.new; 

newMOC.persistentStoreCoordinator = oldActiveAccount.managedObjectContext.persistentStoreCoordinator; 

ActiveAccount *newActiveAccount = [newMOC objectWithID: oldActiveAccount.objectID]; 

現在,每當你從newActiveAccount訪問實例在newMOC被創建並,因此,線僅限於該MOC。 objectID s是持久的。 -persistentStoreCoordinator很少,如果有的話,在mainMOC更改。因此,上述代碼被適當限制。如果源MOC是瞬態的,則上述技術存在問題。因此,我無法保證上述代碼適用於兩個背景MOC。

安德魯

0

我得先問清楚,你爲什麼有同時使用這麼多的背景?

我使用一個用於後臺操作,一個用於主線程。如果我需要爲可丟棄的更改創建另一個,那麼我將創建它並將其傳遞,所以現在我的self.managedObjectContext指向草稿上下文。我絕不會讓我的託管對象生活在可以訪問大量上下文的範圍內。

,如果你正在編寫iOS或OSX這是不完全清楚,但與iOS例如:

如果我需要一個新的視圖控制器推到導航堆棧我將初始化我的目的地視圖控制器的managedObjectContext伊娃作爲以及任何NSManagedObject子類實例。因爲在-prepareForSegue中:我知道是創建草稿上下文還是傳遞當前草稿,我也知道是否需要通過新創建的上下文中的ID引用它們來初始化這些託管對象實例,或者我可以通過他們。

現在在我的視圖控制器中,我可以理所當然地認爲我的託管對象總是與自己綁定在一起。managedObjectContext。

+0

我正在爲iOS開發。我真的只有兩個MOC,一個用於主線程,另一個用於後臺運行。我想我的問題是我有代碼,我試圖重用,所以我已經放入方法。但我不想說X方法只能在這個ManagedObjectContext中運行。在一個案例中,我正在創建一個新的賬戶關係。包含它的對象有一個賬戶iVar。所以我試圖決定是否可以加入到iVar中,或者是否需要爲後臺MOC創建另一個帳戶對象。也許我需要將每種方法限制在給定的MOC上。 – Brian

相關問題