2015-11-06 95 views
0

我有一個應用程序通過websocket偵聽服務器事件。當服務器發送特定事件時,我創建了一個Notification,它是NSManagedObject的一個子類。我稍後將它顯示在我的主視圖控制器中。用NSUndoManager強制保存NSManagedObject

在一個視圖控制器(讓我們稱之爲ObjectViewController),我有這樣的代碼:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [((AppDelegate *)UIApplication.sharedApplication.delegate).managedObjectContext.undoManager beginUndoGrouping]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    AppDelegate * delegate = ((AppDelegate *)UIApplication.sharedApplication.delegate); 
    if (something) { 
     [delegate saveContext]; 
    } else { 
     [delegate.managedObjectContext undo]; 
    } 
} 

它允許我悔棋做幾個不同類型的NSManagedObjects所有操作,當我點擊取消按鈕。

現在的問題是,當我在這個視圖中,我收到一個通知,如果我取消對象的變化,Notification對象被從刪除CoreData

有沒有辦法強制CoreData保存ONE通知,而其他NSManagedObjects保留在撤消組?

回答

1

保存上下文時,它將所有內容保存在上下文中。

IMO,更好的方法是使用單獨的NSManagedObjectContext作爲「暫存」。基本上,您的視圖控制器將創建自己的上下文,或者作爲主要上下文的子節點,或者直接連接到主要上下文的持久存儲協調器(如果後者需要合併保存的更改)。

但是,通過創建子上下文,可能會更好地服務此用例。

這樣,您的「編輯上下文」與主要上下文是分開的。當視圖控制器消失時,您可以保存上下文,或者什麼都不做,並讓它釋放。

因此,您仍然可以在「主要上下文」中進行更改,並且只有在選擇保存上下文時纔會在「編輯上下文」中完成任何操作。

然後,您甚至可以不使用撤消管理器,因爲臨時上下文正在執行該工作。

編輯

看着蘋果文檔後,創建一個新的上下文的 主要背景下的孩子,我只需要設置其屬性parentContext?我 不知道我是如何生活,不知道這個......太有用了! - Sunder

要創建它,是的,這就是你所要做的。使用它有一些缺點,但通常存在轉角情況。只要你不在子上下文中創建新對象並將其對象ID傳遞給另一個MOC,你應該沒問題。

只需進行更改,如果您想與父母分享,只需保存至家長即可。但是請注意,從小孩保存到父母只是將對象更改「複製」到父項中。父上下文仍然必須保存其更改的上下文才能使其進入商店。

+0

看了蘋果文檔後,創建一個新的上下文作爲主要上下文的子節點,我只需要設置它的'parentContext'屬性? 我不知道我是如何生活的,不知道這個......太有用了! – Sunder

+0

要創建它,是的,這就是你所要做的。使用它有一些缺點,但通常存在轉角情況。只要你不在子上下文中創建新對象並將其對象ID傳遞給另一個MOC,你應該沒問題。 –

+0

好的非常感謝你的信息。但我不確定這是否真的適合我的項目:'ObjectViewController'也用於編輯對象。如果在父對象中檢索到對象,我該如何處理當前使用我的子上下文? – Sunder