Skip to content

Commit f6427be

Browse files
authored
chore(ios): remove dead code in experimental runtime (#290)
Removes unreachable and never-populated code from the experimental iOS backend. - Drop `eventListeners`, `addEventListener`, `removeEventListeners` from `RiveReactNativeView` — the Hybrid layer throws before these are ever called - Drop `listenerTasks` from `HybridViewModelListProperty` and `HybridViewModelImageProperty` — the dict is declared and torn down but never populated
1 parent 04d4dc9 commit f6427be

11 files changed

Lines changed: 65 additions & 142 deletions

android/src/new/java/com/rive/RiveReactNativeView.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,11 @@ class RiveReactNativeView(context: ThemedReactContext) : FrameLayout(context) {
9090
this@RiveReactNativeView.surfaceWidth = w
9191
this@RiveReactNativeView.surfaceHeight = h
9292
this@RiveReactNativeView.riveWorker?.let { worker ->
93-
this@RiveReactNativeView.riveSurface = worker.createRiveSurface(st)
94-
Log.d(TAG, "onSurfaceTextureAvailable: surface created")
95-
resizeArtboardIfLayout()
93+
if (this@RiveReactNativeView.riveSurface == null) {
94+
this@RiveReactNativeView.riveSurface = worker.createRiveSurface(st)
95+
Log.d(TAG, "onSurfaceTextureAvailable: surface created")
96+
resizeArtboardIfLayout()
97+
}
9698
}
9799
}
98100

ios/new/HybridViewModelBooleanProperty.swift

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import NitroModules
44
class HybridViewModelBooleanProperty: HybridViewModelBooleanPropertySpec {
55
private let instance: ViewModelInstance
66
private let prop: BoolProperty
7-
private var listenerTasks: [UUID: Task<Void, Never>] = [:]
7+
private let listeners = PropertyListenerStore()
88

99
init(instance: ViewModelInstance, path: String) {
1010
self.instance = instance
@@ -43,8 +43,7 @@ class HybridViewModelBooleanProperty: HybridViewModelBooleanPropertySpec {
4343
}
4444

4545
func addListener(onChanged: @escaping (Bool) -> Void) throws -> () -> Void {
46-
let id = UUID()
47-
let task = Task { @MainActor [weak self] in
46+
return listeners.register(Task { @MainActor [weak self] in
4847
guard let self else { return }
4948
let current = try? await self.instance.value(of: self.prop)
5049
if let current, !Task.isCancelled {
@@ -62,24 +61,10 @@ class HybridViewModelBooleanProperty: HybridViewModelBooleanPropertySpec {
6261
try? await Task.sleep(nanoseconds: 100_000_000)
6362
}
6463
}
65-
}
66-
listenerTasks[id] = task
67-
return { [weak self] in
68-
self?.listenerTasks[id]?.cancel()
69-
self?.listenerTasks.removeValue(forKey: id)
70-
}
71-
}
72-
73-
func removeListeners() throws {
74-
listenerTasks.values.forEach { $0.cancel() }
75-
listenerTasks.removeAll()
64+
})
7665
}
7766

78-
func dispose() throws {
79-
try removeListeners()
80-
}
81-
82-
deinit {
83-
listenerTasks.values.forEach { $0.cancel() }
84-
}
67+
func removeListeners() throws { listeners.cancelAll() }
68+
func dispose() throws { listeners.cancelAll() }
69+
deinit { listeners.cancelAll() }
8570
}

ios/new/HybridViewModelColorProperty.swift

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import NitroModules
44
class HybridViewModelColorProperty: HybridViewModelColorPropertySpec {
55
private let instance: ViewModelInstance
66
private let prop: ColorProperty
7-
private var listenerTasks: [UUID: Task<Void, Never>] = [:]
7+
private let listeners = PropertyListenerStore()
88

99
init(instance: ViewModelInstance, path: String) {
1010
self.instance = instance
@@ -45,8 +45,7 @@ class HybridViewModelColorProperty: HybridViewModelColorPropertySpec {
4545
}
4646

4747
func addListener(onChanged: @escaping (Double) -> Void) throws -> () -> Void {
48-
let id = UUID()
49-
let task = Task { @MainActor [weak self] in
48+
return listeners.register(Task { @MainActor [weak self] in
5049
guard let self else { return }
5150
let current = try? await self.instance.value(of: self.prop)
5251
if let current, !Task.isCancelled {
@@ -64,24 +63,10 @@ class HybridViewModelColorProperty: HybridViewModelColorPropertySpec {
6463
try? await Task.sleep(nanoseconds: 100_000_000)
6564
}
6665
}
67-
}
68-
listenerTasks[id] = task
69-
return { [weak self] in
70-
self?.listenerTasks[id]?.cancel()
71-
self?.listenerTasks.removeValue(forKey: id)
72-
}
73-
}
74-
75-
func removeListeners() throws {
76-
listenerTasks.values.forEach { $0.cancel() }
77-
listenerTasks.removeAll()
66+
})
7867
}
7968

80-
func dispose() throws {
81-
try removeListeners()
82-
}
83-
84-
deinit {
85-
listenerTasks.values.forEach { $0.cancel() }
86-
}
69+
func removeListeners() throws { listeners.cancelAll() }
70+
func dispose() throws { listeners.cancelAll() }
71+
deinit { listeners.cancelAll() }
8772
}

ios/new/HybridViewModelEnumProperty.swift

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import NitroModules
44
class HybridViewModelEnumProperty: HybridViewModelEnumPropertySpec {
55
private let instance: ViewModelInstance
66
private let prop: EnumProperty
7-
private var listenerTasks: [UUID: Task<Void, Never>] = [:]
7+
private let listeners = PropertyListenerStore()
88

99
init(instance: ViewModelInstance, path: String) {
1010
self.instance = instance
@@ -43,8 +43,7 @@ class HybridViewModelEnumProperty: HybridViewModelEnumPropertySpec {
4343
}
4444

4545
func addListener(onChanged: @escaping (String) -> Void) throws -> () -> Void {
46-
let id = UUID()
47-
let task = Task { @MainActor [weak self] in
46+
return listeners.register(Task { @MainActor [weak self] in
4847
guard let self else { return }
4948
let current = try? await self.instance.value(of: self.prop)
5049
if let current, !Task.isCancelled {
@@ -62,24 +61,10 @@ class HybridViewModelEnumProperty: HybridViewModelEnumPropertySpec {
6261
try? await Task.sleep(nanoseconds: 100_000_000)
6362
}
6463
}
65-
}
66-
listenerTasks[id] = task
67-
return { [weak self] in
68-
self?.listenerTasks[id]?.cancel()
69-
self?.listenerTasks.removeValue(forKey: id)
70-
}
71-
}
72-
73-
func removeListeners() throws {
74-
listenerTasks.values.forEach { $0.cancel() }
75-
listenerTasks.removeAll()
64+
})
7665
}
7766

78-
func dispose() throws {
79-
try removeListeners()
80-
}
81-
82-
deinit {
83-
listenerTasks.values.forEach { $0.cancel() }
84-
}
67+
func removeListeners() throws { listeners.cancelAll() }
68+
func dispose() throws { listeners.cancelAll() }
69+
deinit { listeners.cancelAll() }
8570
}

ios/new/HybridViewModelImageProperty.swift

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ class HybridViewModelImageProperty: HybridViewModelImagePropertySpec {
55
private var instance: ViewModelInstance?
66
private var prop: ImageProperty?
77
private var worker: Worker?
8-
private var listenerTasks: [UUID: Task<Void, Never>] = [:]
9-
108
init(instance: ViewModelInstance, path: String, worker: Worker) {
119
self.instance = instance
1210
self.prop = ImageProperty(path: path)
@@ -41,16 +39,9 @@ class HybridViewModelImageProperty: HybridViewModelImagePropertySpec {
4139
return {}
4240
}
4341

44-
func removeListeners() throws {
45-
listenerTasks.values.forEach { $0.cancel() }
46-
listenerTasks.removeAll()
47-
}
42+
func removeListeners() throws {}
4843

49-
func dispose() throws {
50-
try removeListeners()
51-
}
44+
func dispose() throws {}
5245

53-
deinit {
54-
listenerTasks.values.forEach { $0.cancel() }
55-
}
46+
deinit {}
5647
}

ios/new/HybridViewModelListProperty.swift

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ class HybridViewModelListProperty: HybridViewModelListPropertySpec {
55
private let vmiInstance: ViewModelInstance
66
private let prop: ListProperty
77
private let worker: Worker
8-
private var listenerTasks: [UUID: Task<Void, Never>] = [:]
9-
108
// Note: the concurrency API doesn't validate property paths — non-existent
119
// properties return garbage values instead of throwing.
1210
init(instance: ViewModelInstance, path: String, worker: Worker) {
@@ -182,16 +180,9 @@ class HybridViewModelListProperty: HybridViewModelListPropertySpec {
182180
return {}
183181
}
184182

185-
func removeListeners() throws {
186-
listenerTasks.values.forEach { $0.cancel() }
187-
listenerTasks.removeAll()
188-
}
183+
func removeListeners() throws {}
189184

190-
func dispose() throws {
191-
try removeListeners()
192-
}
185+
func dispose() throws {}
193186

194-
deinit {
195-
listenerTasks.values.forEach { $0.cancel() }
196-
}
187+
deinit {}
197188
}

ios/new/HybridViewModelNumberProperty.swift

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import NitroModules
44
class HybridViewModelNumberProperty: HybridViewModelNumberPropertySpec {
55
private let instance: ViewModelInstance
66
private let prop: NumberProperty
7-
private var listenerTasks: [UUID: Task<Void, Never>] = [:]
7+
private let listeners = PropertyListenerStore()
88

99
init(instance: ViewModelInstance, path: String) {
1010
self.instance = instance
@@ -44,8 +44,7 @@ class HybridViewModelNumberProperty: HybridViewModelNumberPropertySpec {
4444
}
4545

4646
func addListener(onChanged: @escaping (Double) -> Void) throws -> () -> Void {
47-
let id = UUID()
48-
let task = Task { @MainActor [weak self] in
47+
return listeners.register(Task { @MainActor [weak self] in
4948
guard let self else { return }
5049
// Emit current value immediately so the first subscription receives it
5150
let current = try? await self.instance.value(of: self.prop)
@@ -64,24 +63,10 @@ class HybridViewModelNumberProperty: HybridViewModelNumberPropertySpec {
6463
try? await Task.sleep(nanoseconds: 100_000_000)
6564
}
6665
}
67-
}
68-
listenerTasks[id] = task
69-
return { [weak self] in
70-
self?.listenerTasks[id]?.cancel()
71-
self?.listenerTasks.removeValue(forKey: id)
72-
}
73-
}
74-
75-
func removeListeners() throws {
76-
listenerTasks.values.forEach { $0.cancel() }
77-
listenerTasks.removeAll()
66+
})
7867
}
7968

80-
func dispose() throws {
81-
try removeListeners()
82-
}
83-
84-
deinit {
85-
listenerTasks.values.forEach { $0.cancel() }
86-
}
69+
func removeListeners() throws { listeners.cancelAll() }
70+
func dispose() throws { listeners.cancelAll() }
71+
deinit { listeners.cancelAll() }
8772
}

ios/new/HybridViewModelStringProperty.swift

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import NitroModules
44
class HybridViewModelStringProperty: HybridViewModelStringPropertySpec {
55
private let instance: ViewModelInstance
66
private let prop: StringProperty
7-
private var listenerTasks: [UUID: Task<Void, Never>] = [:]
7+
private let listeners = PropertyListenerStore()
88

99
init(instance: ViewModelInstance, path: String) {
1010
self.instance = instance
@@ -43,8 +43,7 @@ class HybridViewModelStringProperty: HybridViewModelStringPropertySpec {
4343
}
4444

4545
func addListener(onChanged: @escaping (String) -> Void) throws -> () -> Void {
46-
let id = UUID()
47-
let task = Task { @MainActor [weak self] in
46+
return listeners.register(Task { @MainActor [weak self] in
4847
guard let self else { return }
4948
let current = try? await self.instance.value(of: self.prop)
5049
if let current, !Task.isCancelled {
@@ -62,24 +61,10 @@ class HybridViewModelStringProperty: HybridViewModelStringPropertySpec {
6261
try? await Task.sleep(nanoseconds: 100_000_000)
6362
}
6463
}
65-
}
66-
listenerTasks[id] = task
67-
return { [weak self] in
68-
self?.listenerTasks[id]?.cancel()
69-
self?.listenerTasks.removeValue(forKey: id)
70-
}
71-
}
72-
73-
func removeListeners() throws {
74-
listenerTasks.values.forEach { $0.cancel() }
75-
listenerTasks.removeAll()
64+
})
7665
}
7766

78-
func dispose() throws {
79-
try removeListeners()
80-
}
81-
82-
deinit {
83-
listenerTasks.values.forEach { $0.cancel() }
84-
}
67+
func removeListeners() throws { listeners.cancelAll() }
68+
func dispose() throws { listeners.cancelAll() }
69+
deinit { listeners.cancelAll() }
8570
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import Foundation
2+
3+
final class PropertyListenerStore {
4+
private var tasks: [UUID: Task<Void, Never>] = [:]
5+
6+
func register(_ task: Task<Void, Never>) -> () -> Void {
7+
let id = UUID()
8+
tasks[id] = task
9+
return { [weak self] in
10+
self?.tasks[id]?.cancel()
11+
self?.tasks.removeValue(forKey: id)
12+
}
13+
}
14+
15+
func cancelAll() {
16+
tasks.values.forEach { $0.cancel() }
17+
tasks.removeAll()
18+
}
19+
}

ios/new/RiveReactNativeView.swift

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ struct ViewConfiguration {
2222
class RiveReactNativeView: UIView {
2323
private var riveUIView: RiveUIView?
2424
private var riveInstance: RiveRuntime.Rive?
25-
private var eventListeners: [(UnifiedRiveEvent) -> Void] = []
2625
private var viewReadyContinuations: [CheckedContinuation<Void, Never>] = []
2726
private var isViewReady = false
2827
private var configTask: Task<Void, Never>?
@@ -136,14 +135,6 @@ class RiveReactNativeView: UIView {
136135
}
137136
}
138137

139-
func addEventListener(_ onEvent: @escaping (UnifiedRiveEvent) -> Void) {
140-
eventListeners.append(onEvent)
141-
}
142-
143-
func removeEventListeners() {
144-
eventListeners.removeAll()
145-
}
146-
147138
func setNumberInputValue(name: String, value: Float, path: String?) throws {
148139
throw RuntimeError.error(withMessage: "SMI inputs not supported in experimental API")
149140
}

0 commit comments

Comments
 (0)