Skip to content

Commit 8040747

Browse files
committed
simplify: decode all asset types on background serial queue
decodeImage is thread-safe when RiveFile stays alive (verified with 320+ stress cycles). No need for separate main-thread path.
1 parent 5822b09 commit 8040747

1 file changed

Lines changed: 12 additions & 24 deletions

File tree

ios/ReferencedAssetLoader.swift

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -36,32 +36,20 @@ final class ReferencedAssetLoader {
3636
RCTLogError("\(error)")
3737
}
3838

39-
/// Decodes an asset and applies the result on the main thread.
40-
///
41-
/// - `onMain: true` — decode + apply run synchronously on the caller's
42-
/// thread (must already be main). Used for `decodeImage` which is not
43-
/// thread-safe.
44-
/// - `onMain: false` — decode runs on a serial background queue, then
45-
/// apply + completion dispatch to main. The `[self]` capture keeps the
46-
/// `ReferencedAssetLoader` (and its `activeFileRef`) alive until the
47-
/// main-thread block completes, preventing use-after-free on the factory.
39+
/// Decodes an asset on a background serial queue, then applies the result
40+
/// on the main thread. The `[self]` capture keeps `activeFileRef` alive
41+
/// until completion, preventing use-after-free on the factory.
4842
private func decodeAndApply<T>(
49-
onMain: Bool,
5043
decode: @escaping () -> T?,
5144
apply: @escaping (T) -> Void,
5245
completion: @escaping () -> Void
5346
) {
54-
if onMain {
55-
if let result = decode() { apply(result) }
56-
completion()
57-
} else {
58-
Self.decodeQueue.async { [self] in
59-
let result = decode()
60-
DispatchQueue.main.async {
61-
if let result { apply(result) }
62-
completion()
63-
_ = self
64-
}
47+
Self.decodeQueue.async { [self] in
48+
let result = decode()
49+
DispatchQueue.main.async {
50+
if let result { apply(result) }
51+
completion()
52+
_ = self
6553
}
6654
}
6755
}
@@ -75,17 +63,17 @@ final class ReferencedAssetLoader {
7563
}
7664
switch asset {
7765
case let imageAsset as RiveImageAsset:
78-
decodeAndApply(onMain: true,
66+
decodeAndApply(
7967
decode: { factory.decodeImage(data) },
8068
apply: { imageAsset.renderImage($0) },
8169
completion: completion)
8270
case let fontAsset as RiveFontAsset:
83-
decodeAndApply(onMain: false,
71+
decodeAndApply(
8472
decode: { factory.decodeFont(data) },
8573
apply: { fontAsset.font($0) },
8674
completion: completion)
8775
case let audioAsset as RiveAudioAsset:
88-
decodeAndApply(onMain: false,
76+
decodeAndApply(
8977
decode: { factory.decodeAudio(data) },
9078
apply: { audioAsset.audio($0) },
9179
completion: completion)

0 commit comments

Comments
 (0)