Swift KVO 注意事項和屬性觀察器

2021-08-10 14:16:48 字數 2069 閱讀 5157

誰能不愛 kvo 呢,一處修改,處處得知,多麼優雅的模式啊!等等 notification 模式也可以啊,咳咳,notification 模式下還得發布乙個通知。兩者的優劣對比是乙個很常見的筆試題,但我不覺得這樣的題目是個好題目,大部分情況下兩者能互換,但兩者各有更適合的使用場景,這裡暫不討論了。

關於 kvo 推薦這些文章,篇篇精華。老實說,有了這幾篇文章後以目前我的水準寫不出有價值的啥新東西了,至此本文淪為總結 tips 的水文,話說這麼說,本文總結了些別人踩過和自己踩過的坑,還算有點用,對於在 swift 裡使用 kvo 還是具備一定指導性的:

nshipster: key-value observing, matt 大神的總結和看法

glow 技術團隊:如何自己動手實現 kvo

class myobjecttoobserve: nsobject

}private var mycontext = 0

class myobserver: nsobject

override func observevalueforkeypath(keypath: string?, ofobject object: anyobject?, change: [nsobject : anyobject]?, context: unsafemutablepointer)

} else

}deinit

}

總結如下:

- mutablearrayvalueforkeypath:

- mutablesetvalueforkey:

- mutablesetvalueforkeypath:

- mutableorderedsetvalueforkey:

- mutableorderedsetvalueforkeypath:

kvo 中的其他特徵,如屬性依賴(registering dependent keys),自動/手動通知,在 swift 中都是支援的,已經驗證過。

class stepcounter 

didset }}

}

屬性觀察器只在在初始化完成後觸發,而且不限於 nsobject 的子類,swift 中所有的 class, struct, enum 都可以使用。

swift 內建的array, dictionary, set 等都是值型別,對其內容的修改包括新增,刪除,替換元素也會觸發屬性觀察器。這很好理解,array, dictionary, set 等值型別更改內容後,會複製新的內容給變數,變數指向的位址不同了。對於對應的 oc 版本的型別,這類操作並不會觸發屬性觀察器。但是在上面的第2條裡面的 kvc 方法獲得的集合**在更改內容時會觸發屬性觀察器。具體是什麼導致了觸發,我還不太明白,因為不了解背後的實現機制,老實說我還不知道用什麼手段來進行分析,望指教。

前面提到,在 swift 中使用 kvo 需要觀察者和被觀察者都是 nsoject 的子類才行,一直以來,cocoa 中的 kvo api 都被廣泛吐槽太難用,但是借助 swift 的閉包和泛型也可以實現更優雅的 kvo 模式。

colin eberhardt: swift kvo alternatives

key value observing (kvo) with swift closures

第三方的 swift kvo庫:observable-swift

以上的文章和庫我暫時還看不懂,再等段時間來理解。

ps: 剛才還在微博上看見有人翻譯了 uistackview 的官方文件求**,老實說,為啥要翻譯這種級別的文件,有價值嗎?曾經,我在某部落格找到某個問題的解決方案,順道看看部落格上的內容,有一系列的 core animation 文件翻譯,收藏了下以待日後學習。後來我看他的一系列翻譯,兩篇過後質量就很低了,嚴重影響理解。前不久學習 swift 也看了國內組織翻譯的文件,看了一半還是回來看英文文件。文件這東西還是老老實實看官方文件就好了,雖然有時候官方文件也不咋地,但至少對於所解釋的東西是非常直接的。翻譯這件事不好做,要得翻譯者本身對該技術的理解和寫作能力都不錯才行。

JS 屬性操作注意事項

下列東西不能拿來做判斷 1.所有的相對路徑 img.src href 1.css 2.顏色值不要拿來做判斷 color red f00 rgb 250,0,0 3.innerhtml值不要拿來做判斷 注意事項 js中允許 替換成 odiv.style.width 300px 操作不能設為變數 odi...

屬性操作注意事項02

lang en charset utf 8 documenttitle head 所有的相對路徑位址不能做判斷 1src 2href 3顏色值 rgb 4innerhtml的值不要拿來做判斷 表單元素 id btn1 type button value var oinp document.getel...

cv Mat ptr 和 at 注意事項

宣告了乙個cv mat cloud 1,1000,cv 32fc4 然後point的定義如下 struct point 然後我想取第i個point的指標 query flann matrix reinterpret cast cloud.ptr i 1,3 結果 是錯誤的 正確的方式 應該為 que...