2013-03-15 61 views
0

我正在製作一個繪圖應用程序。每次點擊都會創建一些核心數據實體。用戶可以按下撤消按鈕,並且這些點擊一次就被撤消。這工作正常。在performBlock中的核心數據保存子上下文:刪除撤消堆棧

問題出現在某些自動化任務運行時。我有一個按鈕,它在子環境中創建一堆核心數據實體(自己繪製一些東西),然後保存上下文,以便在主環境中反映更改。

問題在於用戶點擊任務按鈕的次數並不重要,所有更改都分組爲一個撤消步驟。

要說清楚:他完成5個任務,然後再次觸發撤消,他又回到起點。但是我希望他能夠一次撤銷一項任務。

我正在使用UIManagedDocument,它是核心數據堆棧。所以它有2個上下文,一個寫到磁盤上,一個是它的一個子對象,然後爲後臺操作創建一個子對象。

這是我的代碼:

NSManagedObjectContext* childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
childContext.parentContext = self.document.managedObjectContext; 
childContext.undoManager = self.document.undoManager; 
[childContext performBlock:^{ 

    //a lot of things happen here, that generate many entities 

    [childContext save:nil]; 

    [self.document.managedObjectContext performBlock:^{ 

     //completion stuff, update UI... 

    }]; 
}]; 

回答

0

一個想法是附上你想在自己的塊撤消(具有相同的子上下文)的每個代碼塊。也許開始把它分成兩塊,看看它是否有效。

第二個想法是,我認爲每個保存並不是真正的保存,而只是將更改推送到父上下文。所以我的猜測是,父上下文註冊每個孩子保存爲一個可撤銷的事件。也許你可以更頻繁地嘗試保存,然後看看這些塊是否可以撤消。

+0

你描述的正是我想要的:每個子上下文保存爲一個可撤銷事件。但它不是那樣工作的。隨着每個孩子的保存,它將所有以前的操作分組到一個可撤消的事件中,使文檔恢復到打開時的狀態。 – Odrakir 2013-03-16 09:10:37

+0

那麼?您是否嘗試過創建獨立上下文的第一個策略? – Mundi 2013-03-16 13:06:48

+0

如果我理解你是對的,那就是我正在做的。我想要撤消的每個代碼塊都在它自己的performBlock函數中。它不起作用。 – Odrakir 2013-03-18 16:53:39