- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我几乎知道为什么我的 iPad 应用程序崩溃了,但我无法想出一个解决方案的方案。该应用程序是一个拼图应用程序。我有一个比应用商店中的版本更稳定的工作版本,但我仍然有一个讨厌的问题,我不能完全解决。
问题的根源在于用户事件和自动保存之间的冲突。保存基本上将拼图的状态存储为属性列表。除其他外,属性列表包含拼图中所有调色板的汇编,并且对于每个调色板,该调色板上所有部分的详细信息。它运作良好,只是用户事件可能会改变这些细节。调色板本质上是一个包含拼图作为 subview 的 UIView。用户可以在调色板上移动片段或将它们从一个调色板移动到另一个调色板。
我的保存过程分两个阶段进行。第一阶段由计时器启动。此阶段会定期检查是否存在需要保存的用户事件。它设置了一个属性 abortSave
变为 NO,然后触发非重复计时器在开始第二阶段之前等待另一个时间段。
在第二阶段,只要 abortSave
就会进行保存。没有。
同时,如果用户进行了任何影响保存的操作,abortSave
设置为是。这个想法是阶段 1 和阶段 2 之间的延迟比执行用户操作所需的时间长,所以如果 abortSave
是NO,那么进行保存应该是安全的。
这个过程已经消除了 95% 左右的崩溃,但我仍然遇到崩溃。
当然,为了应用程序的良好性能,用户事件以及保存操作都在后台线程中进行。
我遇到的情况类型通常是快速枚举期间的突变,或类似的情况。本质上,一些用户操作是在保存过程中进行更改。如果我复制正在快速枚举的对象然后处理副本,它没有帮助。有时错误会发生在复制语句上。如果对象是数组,我不使用快速枚举,而是使用常规 for 循环来遍历数组。这有点帮助。
我希望这个问题不是太笼统。我想我可以发布一些代码,但我不确定它到底有多大帮助。我不想不必要地混淆这个问题。
我还没有做的一件事是使用另一种方式工作的标志:saveProcessActive
在保存发生之前设置为 YES 并在保存完成时设置为 NO 。如果 saveProcessActive
,则所有用户操作都必须停止。是是的。这种情况的问题是它会导致用户操作的延迟,可能对用户可见,但可能任何延迟都是微不足道的。它只需要保存到下一次检查 abortSave
之前的时间。 .然后,中止的保存过程将变为 saveProcessActive
当它确认中止请求时变为 NO。有更好的解决方案吗?
最佳答案
在内存中复制当前游戏状态应该是一个快速的 Action 。当您想保存时,制作该副本,然后将其交给您的后台队列以使用 dispatch_async()
进行保存.这样做可以消除所有并发问题,因为每条数据只能在单个队列上访问。
编辑:这是我通常如何解决此类问题(未经测试):
- (void)fireSave:(NSTimer *)timer {
id thingToSave = [self.model copyOfThingToSave];
dispatch_async(self.backgroundSavingSerialQueue, ^{
[self writeToDisk:copyOfThingToSave];
}
}
- (void)saveLater {
[self.timer invalidate];
self.timer = [NSTimer scheduledTimerWithTimeInterval:5
target:self
selector:@selector(fireSave:)
userInfo:nil
repeats:NO];
}
[self saveLater]
.除了
writeToDisk:
之外,这里的所有内容都在主线程上。 (传递数据的副本)。由于
writeToDisk:
总是在自己的串行队列上运行,它也避免了竞争条件,即使你要求它比它保存得更快。
关于ios - 需要帮助弄清楚如何避免 iOS 中的崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18543667/
我一直在试图理解人们一直在使用的这个网格系统。有时让我觉得自己很蠢。 我了解如果您使用无边距的 12 网格系统。第 12 列将是 100%,而第 1 列将约为 8.33333%。 我一直在看一些网格系
我们被分配了一个用于系统编程的 ASCII 压缩项目,但我在代码中的某一特定行上遇到了困难。 我问了question关于压缩,在处理完纸上示例文件的前十几个字母后,我将数组代码调整到了我的程序中。在
我正在使用 Appcelerator 框架编写应用程序,但偶尔会发生崩溃。我正在尝试找出导致崩溃的原因,因此我决定查看 iOS 模拟器崩溃报告。当然,这对我来说都是希腊语,但我希望得到一些指导,了解其
有人可以给我一些指导或指导我阅读有关 C++ set 对象的优秀教程吗? 我有一段这样的简单代码: #include using namespace std; int main() { ch
老实说,我不知道我的问题是否有解决方案,但我想在 Swift 中捕捉上下文切换发生的时间。 我正在想象一个需要很长时间才能完成的功能,例如远程服务器上的写操作,我在想是否有办法了解何时(至少在哪一行)
我正在使用 Yii2 并且一直在阅读 theming和 theme inheritance ;但是有一些问题: 考虑以下示例: 'view' => [ 'theme' => [
我尝试使用 AJAX 发布,因为我不想使用提交按钮并在每次单击它时重新加载页面。我正在使用此代码进行 ajax: Ajax loading error, please try again.").sho
我正在尝试找出将在 NodeJS 应用程序中使用的 MongoDB 模型的理想设计。该应用程序的设置类似于调查,某些步骤会根据之前的选择提供选项。这是选择和可能性的示例。 第 1 级:图案类型:纯色、
我有一个 API/Express 路由器: router.post("/signup", async function (req, res) { try { var user
我注意到 JFileChooser 隐藏了 Windows 系统文件。 hiberfil.sys、pagefile.sys、$Recycle.Bin 等文件、一些无法打开的快捷方式文件夹等... 我可
这是我第一次使用 Django,到目前为止,我对这个框架的工作方式印象深刻。我目前正在开发我的第一个应用程序,并正在处理数据库内容,但是,我在弄清楚如何在不运行原始查询的情况下进行内部联接时遇到问题。
我在自动调整蒙版大小方面遇到了一些问题。这是交易:我正在使用最近发布的 TwUI ,它从 UIKit 中获取了很多,但它在 Mac 上。这就是我为 iOS 和 Mac 标记的原因。因此,我创建了一个底
好吧,这是一个很长的,打起精神来! :) 最近我尝试在启动期间启动一个用 bash 编写的看门狗脚本。所以我在 rc.local 中添加了一行,其中包含以下内容: su someuser -c "/h
我在我的机器上安装了多个版本的 Windows 软件开发工具包,有趣的是,我的机器上已经安装了一个 Visual studio Installer工具的版本低于近一年前安装的版本: Windows S
widget('zii.widgets.CMenu', array( 'items'=>array( array('label'=>'Home', '
我是一名优秀的程序员,十分优秀!