如何通过提供多个撤消来保存iOS用户操作以平衡性能?

时间:2011-06-10 21:19:23

标签: iphone grand-central-dispatch

我的应用程序的一个视图上有手指绘画的东西。当用户触摸视图时,我保存当前视图图像,因此我可以在以后必要时撤消它。为了减少滞后,我使用宏中央调度来解雇它,比如

TouchesBegan method...
dispatch_async(dispatch_get_main_queue(), ^{
    [self saveCurrentState];
});

我为此saveCurrentState尝试了不同的方法,即将图像保存到磁盘,核心数据或内存中的图像。最后一种方法是效果最好的方法,但它会使内存使用量增加一倍,并且会因内存使用而危及应用程序崩溃。前两种方法(保存到磁盘或核心数据)产生的滞后量如此之大,以至于如果用户快速连续绘制多条线移除并触摸屏幕,则某些线条将无法绘制,因为程序正忙于保存一个图像而保存另一个的命令到了。

我尝试使用高优先级创建串行队列或使用GCD的3个主要队列之一,但结果始终相同。

我该如何解决?最好的方法是什么?

感谢。

2 个答案:

答案 0 :(得分:2)

是否需要在每次编辑时将图像保存到磁盘?也许您可以备份用户操作并保存。类似的东西:

Line(12, 24, 500, 24)

答案 1 :(得分:1)

你可以即兴发挥的一种方法是使用瓷砖。因此,在每一点上,您只保存自上次写入以来已更改的切片。这样你就不会写不必要的东西,你可能会减少写出的数据量,因为用户不太可能覆盖大部分绘图板。

因此,在写出已更改最后一次迭代的切片后,将所有切片标记为干净。当用户与电路板交互时,将已更改的磁贴标记为脏。用户完成其操作后,写出并发队列中的所有脏磁贴。重复一遍。

您必须使用相同的元数据来确定切片何时更改,以便您可以在给定的迭代中重建切片,以便您可以支持撤消/重做操作。

或者,您可以通过在每个5-10个操作等重要接合点保存图像来改进路径方法,这样撤消/重做就不会那么昂贵且写入不会任