2016-06-21 40 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有點汗。