Core Data undo后台线程删除

Posted

技术标签:

【中文标题】Core Data undo后台线程删除【英文标题】:Core Data undo background thread deletion 【发布时间】:2012-07-08 09:41:30 【问题描述】:

我正在开发一种用户在画布上设置点的绘图应用程序。正在绘制的内容存储为 NSManagedObjects。我还启用了撤消管理器,以便用户可以通过按下按钮来撤消最后的绘图手势。

一切都按预期进行。

然后我有一个按钮可以删除画布上的所有内容(清除画布)。当按下时,我在后台线程上进行删除操作,因为它可能需要一段时间,我想显示一个进度条。然后我将后台线程的模型对象上下文与主线程的模型对象上下文合并。这也很好用。

但我希望用户只需轻按一下撤消按钮即可撤消完整的删除操作。这是我做不到的。

对于多线程部分,我正在关注本教程:http://www.cimgf.com/2011/05/04/core-data-and-threads-without-the-headache/

似乎我无法在两个线程的合并之外撤消此操作(不过,它工作过一次,我不知道为什么)。不知道我是否应该将整个事情嵌套在撤消组中。我已经尝试过,但仍然没有运气。

【问题讨论】:

我相信您应该能够通过将其包装在撤消组中并执行 -undoNestedGroup 来做到这一点。我还没有测试过,但我想知道你是否应该测试一下它是否也能正常工作。 是的,这就是我正在尝试的,但它不起作用,它不会撤消到合并之前的状态。 合并本身是在撤消组内还是只是后台操作? 我尝试只输入合并本身以及合并和后台操作,这是在另一个上下文中,所以我认为这无关紧要。都不行。 ¡哎呀!没关系,我只是又试了一次,现在它起作用了,我想我还有其他不合适的地方。如果您将评论作为答案,我会接受。谢谢! 【参考方案1】:

我相信您可以使用嵌套的撤消组来做到这一点。 包装你的操作并在它们之间合并

-(void)beginUndoGrouping;
-(void)endUndoGrouping;

...并使用-(void)undoNestedGroup 撤消。

【讨论】:

这或多或少起到了作用。我所做的只是在 beginUndoGrouping 和 endUndoGrouping 之间嵌套合并操作(mergeChangesFromContextDidSaveNotification)。现在不管我在另一个线程中做什么,我总是可以撤消合并。

以上是关于Core Data undo后台线程删除的主要内容,如果未能解决你的问题,请参考以下文章

使用 Core Data 从后台线程获取

在后台线程上安全保存 Core Data 托管对象上下文的正确方法?

从后台线程使用 Core Data 托管上下文......你如何正确地做到这一点?

Core Data 使用多个上下文中的新对象从后台线程订购一对多关系保存

Core Data 3 托管对象上下文

MySQL后台线程的清理工作