我的应用程序在iOS6中运行良好,但在未指定的即将推出的iOS版本中,由于NDA原因我无法命名,所有UIViewController
转换动画都停止工作。新视图立即就位。我不确定这个未指定的iOS未来版本是否是原因,因为我在iOS6中偶尔会看到这种情况。
有时动画开始工作一段时间后不久就停止了,让我觉得这是某种内存警告问题,但我的应用程序在大多数情况下都使用了相当合理的~125MB RAM。任何人都可以提供任何建议或事情来调查吗?
答案 0 :(得分:40)
所描述的行为一直存在:如果你在后台线程上工作,然后调用和UIKit方法,那么更新往往会以一种奇怪的方式延迟更新。
因此,您应始终dispatch_async
进入主队列以更新UI。
这些错误非常难以捕捉,因为它们并不总是可预测地发生。
为了捕获它们,我构建了一个方法,该方法调用一些UIKit方法来检查它们是否在主线程上被调用。这使您可以在忘记分发回主队列时停止符号断点。
https://github.com/Cocoanetics/DTFoundation/blob/develop/Core/Source/iOS/Debug/UIView%2BDTDebug.m
答案 1 :(得分:15)
Apple dev论坛就此问题提供了一个很好的解决方法:
这样做:
[UIView setAnimationsEnabled:YES]
动画再次开始运作。我怀疑这是一个直接的iOS7错误,或者在我的代码中的某处动画或UIViewController
启动发生在后台线程上,导致动画停止。可能与未指定的未来iOS版本无关。
答案 2 :(得分:0)
此问题似乎是由后台线程中的UIKit内容引起的。我有一个充满NSOperations的预渲染缓存,它将复杂的UIViews渲染为UIImage来缓存输出。这似乎在iOS6中运行良好,但可能确实有点过关。我需要将这个功能替换为将图像和文本渲染到图形缓冲区而不是使用UIViews和UILabel的东西。
答案 3 :(得分:0)
你所要做的就是抓住主队列,同时在接收来自API的响应时更新UI .Ios默认使用主队列来更新UI,但效率不高100%。因此你必须确保UI仅在主线程上更新,并且执行此操作的方式如下:
DispatchQueue.main.async{
//UI related code eg:
self.label.text = "abc"
self.button.setTitle("xyz",.normal)
self.tableView.reloadData()
}
如果你没有抓住主线程,动画可能会也可能不会起作用。 但是如果你使用主线程动画将定义工作。
在api响应中更新UI时更正代码:
Alamofire.getApiCall(paramaters: parameters, completion:{
response in
// UI related code.
DispatchQueue.main.async{
self.label.text = "abc"
self.button.setTitle("xyz",.normal)
self.tableView.reloadData()
}
})
错误的代码可能导致动画停止并导致奇怪的崩溃:
Alamofire.getApiCall(paramaters: parameters, completion:{
response in
// UI related code.
self.label.text = "abc"
self.button.setTitle("xyz",.normal)
self.tableView.reloadData()
})