2015-12-21 49 views
2

所以,我有這種情況,其中var3的值取決於var1var2。基本上,這可以翻譯成兩種形式:From Performance Wise:Class Computed Property vs Stored Property

A)使用計算的屬性VAR3

class bla { 
    var var1: Int = 0 
    var var2: Int = 0 
    var var3: Int { 
     return var1 * var2 
    } 
} 

B)使用存儲屬性與屬性觀察員既VAR1和VAR2

class bla { 
    var var1: Int = 0 { 
     didSet { 
      var3 = var1 * var2 
     } 
    } 
    var var2: Int = 0 { 
     didSet { 
      var3 = var1 * var2 
     } 
    } 
    var var3: Int = 0 
} 

但是,在我必須處理這個問題的情況下,變量是在UITableViewCell中使用的巨大模型對象的所有部分。在這種情況下使用它,它確實需要儘可能高效,這就是我試圖遠離使用這種情況下計算屬性的原因..原因,據我所知,當Swift獲取var3的值在下一個類執行,它將在運行中計算其值,而不是像B類實現那樣緩存。對? (是否以任何方式快速緩存計算屬性的值?)

現在我真的想知道最好的方法是什麼。事實上,我將這些變量中的一部分遷移到模型對象中,而不是在單元內動態計算它們,是爲了從單元中獲取負載並儘可能平滑地進行滾動,這就告訴我們使用計算的屬性使我的努力毫無意義。另一方面,我發現其中一個變量依賴於3〜4個其他變量的情況,這使得當每個值發生變化時都需要重新計算它,這也是無效的。

任何建議?我做錯了嗎?

+0

你真的* *覺得變量的訪問性能的關鍵部分的碼?一般來說:你多久寫一次var1和var2,多久讀一次var3?我個人不會擔心這部分,直到你*看到*切斷性能問題。先讓它工作,然後重構,否則你會大量過度工程。 – luk2302

+0

好吧。他們只是簡單的例子。事實是,將該邏輯移入模型對象級別,在表視圖性能方面確實做了一些改進,我覺得如果將它們作爲計算屬性,我會鬆動它。 – Mamouneyya

回答

0

這是我目前使用的方法,其中一個實例屬性需要在某個時候被計算和緩存後續訪問:

class AClassWithCachedInstanceVariables { 

    private var _var1: Var1Type? 

    var var1: Var1Type { 
     if let var1 = self._var1 { 
      // cache hit 
      return var1 
     } else { 
      // cache miss 
      let var1 = self.getVar1() 
      let self._var1 = var1 
      return var1 
     } 
    } 


    private var _var2: Var2Type? 

    var var2: Var2Type { 
     if let var2 = self._var2 { 
      // cache hit 
      return var2 
     } else { 
      // cache miss 
      let var2 = self.getVar2() 
      let self._var2 = var2 
      return var2 
     } 
    } 


    /* Extra: let’s say we also want to require var1 and var2 
    to be recomputed whenever this other variable is changed */ 
    var otherVar: OtherVarType? { 
     didSet(oldOtherVar) { 
      if otherVar != oldOtherVar { 
       self._var1 = nil 
       self._var2 = nil 
      } 
     } 
    } 

    private func getVar1() -> Var1Type { 
     // compute stuff... 
     return Var1Type() 
    } 

    private func getVar2() -> Var2Type { 
     // compute stuff... 
     return Var2Type() 
    } 
}