Skip to content

Commit f823eb2

Browse files
committed
update
1 parent b54117e commit f823eb2

4 files changed

Lines changed: 31 additions & 14 deletions

File tree

example/src/App.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import TemplatePage from './pages/TemplatePage';
1313
import EventsExample from './pages/RiveEventsExample';
1414
import StateMachineInputsExample from './pages/RiveStateMachineInputsExample';
1515
import TextRunExample from './pages/RiveTextRunExample';
16+
import OutOfBandAssets from './pages/OutOfBandAssets';
1617

1718
type RootStackParamList = {
1819
Home: undefined;
@@ -22,6 +23,7 @@ type RootStackParamList = {
2223
RiveStateMachineInputs: undefined;
2324
RiveTextRun: undefined;
2425
Template: undefined;
26+
OutOfBandAssets: undefined;
2527
};
2628

2729
const Stack = createStackNavigator<RootStackParamList>();
@@ -63,6 +65,12 @@ function HomeScreen({ navigation }: { navigation: any }) {
6365
>
6466
<Text style={styles.buttonText}>Rive Text Run Example</Text>
6567
</TouchableOpacity>
68+
<TouchableOpacity
69+
style={styles.button}
70+
onPress={() => navigation.navigate('OutOfBandAssets')}
71+
>
72+
<Text style={styles.buttonText}>Out of band assets</Text>
73+
</TouchableOpacity>
6674
<TouchableOpacity
6775
style={styles.button}
6876
onPress={() => navigation.navigate('Template')}
@@ -118,6 +126,11 @@ export default function App() {
118126
component={TextRunExample}
119127
options={{ title: 'Rive Text Runs' }}
120128
/>
129+
<Stack.Screen
130+
name="OutOfBandAssets"
131+
component={OutOfBandAssets}
132+
options={{ title: 'Out of Band Asset' }}
133+
/>
121134
<Stack.Screen
122135
name="Template"
123136
component={TemplatePage}

ios/HybridRiveFile.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ class HybridRiveFile: HybridRiveFileSpec {
66
var riveFile: RiveFile?
77
var referencedAssetCache: ReferencedAssetCache?
88
var assetLoader: ReferencedAssetLoader?
9+
var cachedFactory: RiveFactory?
910
private var weakViews: [Weak<RiveReactNativeView>] = []
1011

1112
public func setRiveFile(_ riveFile: RiveFile) {
1213
self.riveFile = riveFile
1314
}
1415

1516
func registerView(_ view: RiveReactNativeView) {
16-
weakViews.append(Weak(value: view))
17+
weakViews.append(Weak(view))
1718
}
1819

1920
func unregisterView(_ view: RiveReactNativeView) {
@@ -78,7 +79,11 @@ class HybridRiveFile: HybridRiveFileSpec {
7879
var hasChanged = false
7980
for (key, assetData) in assetsData {
8081
guard let asset = cache[key] else { continue }
81-
loader.loadAsset(source: assetData, asset: asset)
82+
if let riveFactory = cachedFactory {
83+
loader.loadAsset(source: assetData, asset: asset, factory: riveFactory)
84+
} else {
85+
RCTLogError("[RiveFile] no factory available for update")
86+
}
8287
hasChanged = true
8388
}
8489

ios/HybridRiveFileFactory.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,18 @@ import RiveRuntime
44
final class HybridRiveFileFactory: HybridRiveFileFactorySpec {
55
let assetLoader = ReferencedAssetLoader()
66

7-
private func buildRiveFile(data: Data, loadCdn: Bool, referencedAssets: ReferencedAssetsType?) throws -> (file: RiveFile, cache: ReferencedAssetCache, loader: ReferencedAssetLoader?) {
7+
private func buildRiveFile(data: Data, loadCdn: Bool, referencedAssets: ReferencedAssetsType?) throws -> (file: RiveFile, cache: ReferencedAssetCache, factory: RiveFactory?, loader: ReferencedAssetLoader?) {
88
var referencedAssetCache = SendableRef(ReferencedAssetCache())
9-
let customLoader = assetLoader.createCustomLoader(referencedAssets: referencedAssets, cache: referencedAssetCache)
9+
var factoryCache: SendableRef<RiveFactory?> = .init(nil)
10+
let customLoader = assetLoader.createCustomLoader(referencedAssets: referencedAssets, cache: referencedAssetCache, factory: factoryCache)
1011

1112
let riveFile = if let customLoader = customLoader {
1213
try RiveFile(data: data, loadCdn: loadCdn, customAssetLoader: customLoader)
1314
} else {
1415
try RiveFile(data: data, loadCdn: loadCdn)
1516
}
1617

17-
return (file: riveFile, cache: referencedAssetCache.value, loader: customLoader != nil ? assetLoader : nil)
18+
return (file: riveFile, cache: referencedAssetCache.value, factory: factoryCache.value, loader: customLoader != nil ? assetLoader : nil)
1819
}
1920

2021
// MARK: Public Methods
@@ -44,6 +45,9 @@ final class HybridRiveFileFactory: HybridRiveFileFactorySpec {
4445
let hybridRiveFile = HybridRiveFile()
4546
hybridRiveFile.riveFile = result.file
4647
hybridRiveFile.referencedAssetCache = result.cache
48+
if let factory = result.factory {
49+
hybridRiveFile.cachedFactory = factory
50+
}
4751
hybridRiveFile.assetLoader = result.loader
4852
return hybridRiveFile
4953
} catch let error as NSError {
@@ -105,11 +109,12 @@ final class HybridRiveFileFactory: HybridRiveFileFactorySpec {
105109
do {
106110
let assetLoader = self.assetLoader
107111
let referencedAssetCache = SendableRef(ReferencedAssetCache())
112+
let factoryCache = SendableRef<RiveFactory?>(nil)
108113
let riveFile = try await withCheckedThrowingContinuation { continuation in
109114
DispatchQueue.global(qos: .userInitiated).async {
110115
do {
111116
let riveFile =
112-
if let customLoader = assetLoader.createCustomLoader(referencedAssets: referencedAssets, cache: referencedAssetCache) {
117+
if let customLoader = assetLoader.createCustomLoader(referencedAssets: referencedAssets, cache: referencedAssetCache, factory: factoryCache) {
113118
try RiveFile(resource: resource, loadCdn: loadCdn, customAssetLoader: customLoader)
114119
} else {
115120
try RiveFile(resource: resource, loadCdn: loadCdn)

ios/ReferencedAssetLoader.swift

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
import NitroModules
22
import RiveRuntime
33

4-
final class Ref<T> {
5-
var value: T
6-
init(_ value: T) {
7-
self.value = value
8-
}
9-
}
10-
114
struct FileAndCache {
125
var file: RiveFile
136
var cache: [String: RiveFileAsset]
@@ -194,7 +187,7 @@ final class ReferencedAssetLoader {
194187
loadAssetInternal(source: source, asset: asset, factory: factory)
195188
}
196189

197-
func createCustomLoader(referencedAssets: ReferencedAssetsType?, cache: Ref<ReferencedAssetCache>)
190+
func createCustomLoader(referencedAssets: ReferencedAssetsType?, cache: SendableRef<ReferencedAssetCache>, factory factoryOut: SendableRef<RiveFactory?>)
198191
-> LoadAsset?
199192
{
200193
guard let referencedAssets = referencedAssets, let referencedAssets = referencedAssets.data
@@ -209,6 +202,7 @@ final class ReferencedAssetLoader {
209202
let usedKey = assetByUniqueName != nil ? asset.uniqueName() : asset.name()
210203

211204
cache.value[asset.uniqueName()] = asset
205+
factoryOut.value = factory
212206

213207
self.loadAssetInternal(source: assetData, asset: asset, factory: factory)
214208

0 commit comments

Comments
 (0)