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