2016-06-21 26 views
1

我在我的swift iOS应用程序中遇到问题,我无法理解哪个是真正的问题。我有一个UITabBarController在每个选项卡上有五个UINavigationController。这些控制器的主要内容是UICollectionView从具有自定义UICollectionViewCells(每个CollectionView约30个)的WebService动态填充自定义UIImageViews,自定义UILabels和从自定义xib文件加载的自定义UIButtons。iOS冻结了UI,没有错误日志

当我推动几个控制器都运行良好(CollectionViews变得有点慢,但我认为这是正常的内存使用情况),但是当一个NavigationController包含6或7控制器,我尝试向下滚动,我的UI冻结,应用程序不会崩溃,我不会收到任何类型的运行时错误。我仍然可以使用主页按钮退出,但应用程序已完全锁定。

我出列与标识每一个的CollectionView的每一个细胞,我使用这个属性在每一个自定义单元格的表现:

layer.shouldRasterize = true 
layer.rasterizationScale = UIScreen().scale 

我试图

  1. 调试视图太看看一些UIWindow或UIView是否覆盖控制器视图
  2. 停止图像加载并显示空白imageViews
  3. 在UICollectionView滚动委托方法用于清除代码

但问题始终是第六或第七控制器可重复性,使得一些压力测试。我也看过FPS,但价值总是从40到60,看起来不错。 CPU使用率总是非常高,90/100%,但方法didReceiveMemoryWarning永远不会被解雇。

我的目标是我的应用可以在不冻结的情况下推送很多控制器,或者变得非常慢,但是我无法理解我错过了什么。

+1

当应用程序冻结时,使用调试器暂停它。看看主线程的堆栈跟踪,看看它在做什么。 –

+0

由于冻结是随机的,我不知道在哪里放置断点。我在应用程序委托中尝试过,但我不知道在那一刻堆栈跟踪是否会受到影响。 – lubilis

+0

你不需要一个断点。只需点击调试控件中的“暂停”按钮即可。 –

回答

0

由于Philip Mills

问题是,我在呼唤这个代码在我的自定义UICollectionViewCell设置:

func rotateWithDuration(duration: NSTimeInterval, indeterminate: Bool) { 

    UIView.animateWithDuration(duration, delay: 0.0, options: .CurveLinear, animations: { 

     self.transform = CGAffineTransformRotate(self.transform, CGFloat(M_PI)) 

     }, completion: { finished -> Void in 

      if indeterminate { 
       self.rotateWithDuration(duration, indeterminate: indeterminate) 
      } 
    }) 
} 

查看旋转动画在每一个细胞无限制地运行,所以CPU有点汗。