はじめに
KVOとはKey-Value Observing
の略で、対象のObjectの値を監視し、変更のタイミングで通知を行ってくれるものです。
とても簡単に特定の値の監視を行うことができますので、今回はその使い方についてまとめてみました。
KVOの使い方
監視の登録方法について
Objectの値の監視を登録するにはobserve(_:options:changeHandler:)
を使用します。
各引数の説明を簡単に行います。
func observe<Value>(_ keyPath: KeyPath<T, Value>, options: NSKeyValueObservingOptions = [], changeHandler: @escaping (T, NSKeyValueObservedChange<Value>) -> Void) -> NSKeyValueObservation
-
keyPath
:KeyPath
形式で監視したいObjectの値を指定 -
options
: 変更前後、どの値を通知してもらうか指定するオプション -
changeHandler
: Value変更時に呼ばれるHandler-
T
: 対象のObject -
NSKeyValueObservedChange<Value>
: 監視対象の値の変更時の値を格納
-
実例
では実例を見ていきましょう、使い方は簡単です。
下の例ではview
のframe
の変更時に通知をするよう処理を記述しています。
/// インスタンスを保持
var observations = [NSKeyValueObservation]()
/// Objectの値の監視を追加
func addKeyValueObserver() {
let observation = view.observe(\.frame, options: [.new, .old], changeHandler: { object, change in
// value変更時の処理を記載
print("変更前の値: \(change.newValue), 変更後の値: \(change.oldValue)")
})
observations.append(observation)
}
/// 監視を停止し、インスタンスを削除
func removeKeyValueObserver() {
// 監視を停止
observations.forEach({ $0.invalidate() })
observations.removeAll()
}
options
で設定している値はnew
で変更後の値を通知するよう指定、old
で変更前の値を通知するよう指定できます。
ちなみに変更が通知された際に、変更された値の中身を確認する必要がない場合はoptions:
は省略することができます。
その場合は、newValue
およびoldValue
はnil
になります。
KVOの使い所
プロパティを外から監視できる
既存のframeworkのプロパティなど、変化を検知したいが検知するためのdelegate
が存在しない場合などは、KVOを使用して該当のプロパティ対して外から監視を行い、プロパティの変更を検知をすることができます。
おわりに
KVOを使用することで簡単にプロパティの監視を行うことが出来ますので、是非使い所を見つけて使ってみてください。