Skip to content

Commit e470716

Browse files
committed
fix: prefetch hangs when called concurrently
1 parent 67e8783 commit e470716

2 files changed

Lines changed: 9 additions & 23 deletions

File tree

example/ios/Podfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -892,7 +892,7 @@ PODS:
892892
- React-debug
893893
- react-native-safe-area-context (4.9.0):
894894
- React-Core
895-
- react-native-turbo-image (1.23.0):
895+
- react-native-turbo-image (1.23.1):
896896
- APNGKit
897897
- Gifu
898898
- glog
@@ -1276,7 +1276,7 @@ SPEC CHECKSUMS:
12761276
React-logger: 55764cd993880c6f887505854581c9faf68feff2
12771277
React-Mapbuffer: 15dfcfeb4428d8799cce75e7fe85b18b706029e0
12781278
react-native-safe-area-context: 435f4c13ac75ceed6135382ee77d57d1a5b5b2d6
1279-
react-native-turbo-image: 460a561a934738cc15a87dad8c0d1e3d76b90d5b
1279+
react-native-turbo-image: d484495eb22124812c83c8befbbecd762643ef47
12801280
React-nativeconfig: b4d4e9901d4cabb57be63053fd2aa6086eb3c85f
12811281
React-NativeModulesApple: 541d64309a3037060cc416db5c8a63ee5884048e
12821282
React-perflogger: 5f49905de275bac07ac7ea7f575a70611fa988f2

ios/TurboImageViewManager.swift

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Nuke
33
@objc(TurboImageViewManager)
44
class TurboImageViewManager: RCTViewManager {
55

6-
private var prefetcher: ImagePrefetcher?
6+
private var prefetchers: [String: ImagePrefetcher] = [:]
77

88
override func view() -> (TurboImageView) {
99
return TurboImageView()
@@ -23,6 +23,7 @@ extension TurboImageViewManager {
2323
with cachePolicy: String,
2424
resolve: @escaping RCTPromiseResolveBlock,
2525
reject: @escaping RCTPromiseRejectBlock) {
26+
2627
let imageRequests: [ImageRequest] = sources.map {
2728
guard let uri = $0["uri"] as? String,
2829
let url = URL(string: uri)
@@ -34,37 +35,22 @@ extension TurboImageViewManager {
3435
}
3536
return ImageRequest(urlRequest: urlRequest)
3637
}.compactMap{ $0 }
38+
39+
let key = UUID().uuidString
40+
var prefetcher: ImagePrefetcher?
3741
if(cachePolicy == "dataCache") {
3842
prefetcher = ImagePrefetcher(pipeline: ImagePipeline(configuration: .withDataCache))
3943
} else {
4044
prefetcher = ImagePrefetcher()
4145
}
46+
prefetchers[key] = prefetcher
4247
prefetcher?.startPrefetching(with: imageRequests)
4348
prefetcher?.didComplete = {
4449
resolve(true)
50+
self.prefetchers[key] = nil
4551
}
4652
}
4753

48-
@objc
49-
func dispose(_ sources: [Source],
50-
resolve: @escaping RCTPromiseResolveBlock,
51-
reject: @escaping RCTPromiseRejectBlock) {
52-
let imageRequests: [ImageRequest] = sources.map {
53-
guard let uri = $0["uri"] as? String,
54-
let url = URL(string: uri)
55-
else { return nil }
56-
57-
var urlRequest = URLRequest(url: url)
58-
if let headers = $0["headers"] as? [String: String] {
59-
urlRequest.allHTTPHeaderFields = headers
60-
}
61-
return ImageRequest(urlRequest: urlRequest)
62-
}.compactMap{ $0 }
63-
64-
prefetcher?.stopPrefetching(with: imageRequests)
65-
resolve("Success")
66-
}
67-
6854
@objc
6955
func clearMemoryCache(_ resolve: @escaping RCTPromiseResolveBlock,
7056
reject: @escaping RCTPromiseRejectBlock) {

0 commit comments

Comments
 (0)