Skip to content

Commit e8eda52

Browse files
authored
fix: Serialize metering KVO updates on queue (#3977)
* fix: Serialize metering KVO updates on queue * fix: Keep explicit self guard in metering KVO callbacks
1 parent 09030e6 commit e8eda52

1 file changed

Lines changed: 15 additions & 15 deletions

File tree

packages/react-native-vision-camera/ios/Utils/MeteringTask.swift

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,15 @@ final class MeteringTask {
253253
let settledAt = self.meteringStates[mode]?.settledAt ?? .now
254254
self.meteringStates[mode] = MeteringProgress(settledAt: settledAt)
255255
}
256+
private func onMeteringChanged(for mode: MeteringMode, isAdjusting: Bool) {
257+
guard !isFinished else { return }
258+
if isAdjusting {
259+
self.onMeteringAdjusting(for: mode)
260+
} else {
261+
self.onMeteringSettled(for: mode)
262+
}
263+
self.update()
264+
}
256265

257266
/**
258267
* Starts metering exposure (AE) to the given `CGPoint`.
@@ -271,12 +280,9 @@ final class MeteringTask {
271280
options: [.new]
272281
) { [weak self] _, _ in
273282
guard let self else { return }
274-
if device.isAdjustingExposure {
275-
self.onMeteringAdjusting(for: .ae)
276-
} else {
277-
self.onMeteringSettled(for: .ae)
283+
self.queue.async {
284+
self.onMeteringChanged(for: .ae, isAdjusting: self.device.isAdjustingExposure)
278285
}
279-
self.update()
280286
})
281287
// Request AF to lock to the specific point
282288
self.device.exposurePointOfInterest = point
@@ -300,12 +306,9 @@ final class MeteringTask {
300306
options: [.new]
301307
) { [weak self] _, _ in
302308
guard let self else { return }
303-
if device.isAdjustingFocus {
304-
self.onMeteringAdjusting(for: .af)
305-
} else {
306-
self.onMeteringSettled(for: .af)
309+
self.queue.async {
310+
self.onMeteringChanged(for: .af, isAdjusting: self.device.isAdjustingFocus)
307311
}
308-
self.update()
309312
})
310313
// Request AF to lock to the specific point
311314
device.focusPointOfInterest = point
@@ -326,12 +329,9 @@ final class MeteringTask {
326329
options: [.new]
327330
) { [weak self] _, _ in
328331
guard let self else { return }
329-
if device.isAdjustingWhiteBalance {
330-
self.onMeteringAdjusting(for: .awb)
331-
} else {
332-
self.onMeteringSettled(for: .awb)
332+
self.queue.async {
333+
self.onMeteringChanged(for: .awb, isAdjusting: self.device.isAdjustingWhiteBalance)
333334
}
334-
self.update()
335335
})
336336
// Request AWB to focus
337337
device.whiteBalanceMode = try getWhiteBalanceMode(responsiveness: responsiveness)

0 commit comments

Comments
 (0)