我的应用程序的MasterView包含一个表格视图,其中包含10个单元格,其中包含一些核心数据对象,例如" title" (以前从互联网上下载,见下一段)。感谢模板" Master-Detail Application"我可以使用内置的NSFetchedResultsController及其处理核心数据处理的方法(例如删除行)。运行应用程序时,单元格将配置现有的核心数据对象。在这一点上,我可以像预期的那样删除那些条目。
此外,我的应用程序还有一个刷新按钮。点击时,它会从Internet加载一些新数据并将其转换为保存到核心数据的对象。单元格以与之前相同的方式再次配置自身,UITableView获得刷新。我可以删除一个条目,但是现在,只要我删除了一个然后正常消失的条目,表就冻结了(而不是整个应用程序),因为它的单元格不再可以替换/不作出反应做手势。我可以刷新并且工作(之前删除了一个后再次输入10个条目),但是单元格仍然无法使用。我必须停止应用程序才能恢复正常功能。
重新启动时,之前删除的一个条目 - 如预期的那样 - 消失了,剩下9个条目。此时一切正常,我可以删除多个没有问题。但是,只要进行手动刷新,我们就会立即删除条目时与之前相同。
缺少特定内容时的常见模式?我很高兴发布一些代码,但我现在不知道哪些部分会有所帮助......
答案 0 :(得分:3)
如果应用程序真的冻结,此类问题的常见来源是deadlocks。如果您在任何地方使用dispatch_sync
,那么这是问题的常见来源(特别是从主线程中使用dispatch_sync
到最终将另一个dispatch_sync
传回主线程的内容。如果你正在使用NSLock
或@synchronized
,并以递归方式调用它们,那么你也可能以这种方式死锁。
问题的另一个来源是无限循环(例如永远不满足的while
子句中的错误)。如果你在主线程中有这样的循环,那将冻结UI。 (任何阻止主线程的东西都会冻结UI。)
您可以通过Xcode中的调试器运行应用程序来诊断冻结的位置,当应用程序冻结时,按下调试器的“暂停”按钮。虽然它经常会在一些相当神秘的汇编程序代码中间暂停,但您通常可以查看堆栈跟踪以确定应用程序在冻结时的位置。
如果只是因为您的操作没有看到您的UI更新,请尝试确保在主队列上调用reloadData
方法,如果不是,例如:
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
答案 1 :(得分:0)
不确定是否相关,但是我遇到了带有页眉和页脚视图的表格视图的冻结问题,这些内容在Core Data抓取请求后手动重新加载。表格视图在获取后立即重新加载,有时会停止响应触摸。将tableView.reloadData()延迟0.1秒可以完全解决问题。
(没有页眉和页脚视图,一切正常)。