У меня есть следующий код для наблюдения за изменениями баланса белого через KVO в Swift.
self.addObserver(self, forKeyPath: "videoInput.device.deviceWhiteBalanceGains", options: [.new, .old], context: &whitebalanceGainsObserverContext)
А затем в наблюдаемом значении (...) я делаю это:
if context == &whitebalanceGainsObserverContext {
if let newNSValue = change?[.newKey] as? NSValue {
var gains = AVCaptureDevice.WhiteBalanceGains()
newNSValue.getValue(&gains)
/* Crashes here on some devices in AppStore, throws an exception */
let newTemperatureAndTint = self.videoInput?.device.temperatureAndTintValues(for: gains)
}
}
Я никогда не смогу воспроизвести аварию, поэтому я хочу знать, как избежать аварии. Какие проверки я ставлю, чтобы избежать создаваемого исключения?
РЕДАКТИРОВАТЬ: я также пытался использовать новый API наблюдения следующим образом:
deviceWBGainsObservation = observe(\.videoInput?.device.deviceWhiteBalanceGains, options: [.old, .new]) { (obj, change) in
if let newNSValue = change.newValue {
}
}
И даже это,
deviceWBGainsObservation = videoDevice?.observe(\.deviceWhiteBalanceGains, options: [.old, .new]) {[unowned self] (object, change) in
if let newNSValue = change.newValue {
}
}
А также это:
private var videoDevice:AVCaptureDevice? {
didSet {
deviceWBGainsObservation = videoDevice?.observe(\.deviceWhiteBalanceGains, options: [.old, .new]) {[unowned self] (object, change) in
if let newNSValue = change.newValue {
}
}
}
Проблема в том, что в этом случае значение изменения всегда равно нулю. Почему это?