From 60554ab70a8443530a2b3c5439f098dde33dc3b3 Mon Sep 17 00:00:00 2001 From: duguyihou Date: Sat, 14 Sep 2024 18:04:25 +1000 Subject: [PATCH] 345 feature instant resolution for already fetched images in prefetch (#349) * refactor(prefetch): ios * refactor(prefetch): android --- .../java/com/turboimage/TurboImageModule.kt | 19 +++++++++++++++++-- ios/TurboImageViewManager.swift | 6 ++++-- src/types.ts | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/android/src/main/java/com/turboimage/TurboImageModule.kt b/android/src/main/java/com/turboimage/TurboImageModule.kt index 9b4272d..99b306f 100644 --- a/android/src/main/java/com/turboimage/TurboImageModule.kt +++ b/android/src/main/java/com/turboimage/TurboImageModule.kt @@ -10,12 +10,20 @@ import okhttp3.Headers class TurboImageModule(private val context: ReactApplicationContext) : ReactContextBaseJavaModule(context) { - private var imageLoader: ImageLoader? = null + private var imageLoader: ImageLoader? = null override fun getName(): String = REACT_CLASS @ReactMethod fun prefetch(sources: ReadableArray, cachePolicy: String, promise: Promise) { + var completedRequestCount = 0 + fun handleRequestCount() { + completedRequestCount++ + if (sources.size() == completedRequestCount) { + promise.resolve(true) + } + } + val imageRequests = sources.toArrayList().map { source -> val uri = (source as HashMap<*, *>)["uri"] as String val headers = source["headers"] as? HashMap<*, *> @@ -28,10 +36,18 @@ class TurboImageModule(private val context: ReactApplicationContext) : ImageRequest.Builder(context) .headers(headersBuilder.build()) .data(uri) + .listener( + onSuccess = { _, _ -> handleRequestCount() }, + onError = { _, _ -> handleRequestCount() } + ) .build() } else { ImageRequest.Builder(context) .data(uri) + .listener( + onSuccess = { _, _ -> handleRequestCount() }, + onError = { _, _ -> handleRequestCount() } + ) .build() } } @@ -41,7 +57,6 @@ class TurboImageModule(private val context: ReactApplicationContext) : imageRequests.forEach { imageRequest -> imageLoader?.enqueue(imageRequest) } - promise.resolve("Success") } @ReactMethod diff --git a/ios/TurboImageViewManager.swift b/ios/TurboImageViewManager.swift index 173c2a7..696a534 100644 --- a/ios/TurboImageViewManager.swift +++ b/ios/TurboImageViewManager.swift @@ -40,7 +40,9 @@ extension TurboImageViewManager { prefetcher = ImagePrefetcher() } prefetcher?.startPrefetching(with: imageRequests) - resolve("Success") + prefetcher?.didComplete = { + resolve(true) + } } @objc @@ -69,7 +71,7 @@ extension TurboImageViewManager { ImageCache.shared.removeAll() resolve("Success") } - + @objc func clearDiskCache(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { diff --git a/src/types.ts b/src/types.ts index 48fd4af..f4d26c5 100644 --- a/src/types.ts +++ b/src/types.ts @@ -70,7 +70,7 @@ export interface TurboImageProps extends AccessibilityProps, ViewProps { } export type TurboImageApi = { - prefetch: (sources: Source[], cachePolicy?: CachePolicy) => Promise; + prefetch: (sources: Source[], cachePolicy?: CachePolicy) => Promise; dispose: (sources: Source[]) => Promise; clearMemoryCache: () => Promise; clearDiskCache: () => Promise;