Skip to content

Commit 190319e

Browse files
committed
Refactor Future and ImageLoader to enhance method visibility and improve loading futures management
1 parent f7b06c8 commit 190319e

File tree

4 files changed

+41
-39
lines changed

4 files changed

+41
-39
lines changed

Assets/_PackageRoot/Runtime/Future/Future.WebRequest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace Extensions.Unity.ImageLoader
66
{
77
public partial class Future<T>
88
{
9-
internal Future<T> SetWebRequest(UnityWebRequest webRequest)
9+
protected virtual Future<T> SetWebRequest(UnityWebRequest webRequest)
1010
{
1111
WebRequest = PrepareWebRequest(webRequest);
1212
return this;
@@ -17,7 +17,7 @@ protected virtual UnityWebRequest PrepareWebRequest(UnityWebRequest webRequest)
1717
return webRequest;
1818
}
1919

20-
internal UnityWebRequestAsyncOperation SendWebRequest()
20+
protected virtual UnityWebRequestAsyncOperation SendWebRequest()
2121
{
2222
if (WebRequest == null)
2323
throw new Exception($"[ImageLoader] Future[id={Id}] UnityWebRequest is not set. Use SetWebRequest method before calling SendWebRequest.");

Assets/_PackageRoot/Runtime/ImageLoader.cs

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,11 @@
11
using UnityEngine;
2-
using System;
32
using System.Collections.Generic;
43
using System.Threading.Tasks;
5-
using System.Collections.Concurrent;
6-
using System.Linq;
74

85
namespace Extensions.Unity.ImageLoader
96
{
107
public static partial class ImageLoader
118
{
12-
private static ConcurrentDictionary<string, Future<Sprite>> loadingInProcess = new ConcurrentDictionary<string, Future<Sprite>>();
13-
private static void AddLoading(Future<Sprite> future)
14-
{
15-
if (!loadingInProcess.TryAdd(future.Url, future))
16-
throw new Exception($"[ImageLoader] Future[id={future.Id}] AddLoading: already loading\n{future.Url}");
17-
18-
if (settings.debugLevel.IsActive(DebugLevel.Log))
19-
Debug.Log($"[ImageLoader] Future[id={future.Id}] AddLoading: total {loadingInProcess.Count} loading tasks\n{future.Url}");
20-
}
21-
private static void RemoveLoading(Future<Sprite> future) => RemoveLoading(future.Url);
22-
private static void RemoveLoading(string url)
23-
{
24-
if (loadingInProcess.TryRemove(url, out var future))
25-
{
26-
if (settings.debugLevel.IsActive(DebugLevel.Log))
27-
Debug.Log($"[ImageLoader] Future[id={future.Id}] RemoveLoading: left {loadingInProcess.Count} loading tasks\n{url}");
28-
}
29-
else
30-
{
31-
if (settings.debugLevel.IsActive(DebugLevel.Warning))
32-
Debug.LogWarning($"[ImageLoader] Future[id={future.Id}] RemoveLoading: not found in loading tasks\n{url}");
33-
}
34-
}
35-
369
/// <summary>
3710
/// Initialization of static variables, should be called from main thread at project start
3811
/// </summary>
@@ -46,20 +19,39 @@ public static void Init()
4619
/// Check if the url is loading right now
4720
/// </summary>
4821
/// <returns>Returns true if the url is loading right now</returns>
49-
public static bool IsLoading(string url) => loadingInProcess.ContainsKey(url);
22+
public static bool IsLoadingSprite<T>(string url) => Future<Sprite>.IsLoading(url);
23+
24+
/// <summary>
25+
/// Check if the url is loading right now
26+
/// </summary>
27+
/// <returns>Returns true if the url is loading right now</returns>
28+
public static bool IsLoadingTexture<T>(string url) => Future<Texture2D>.IsLoading(url);
5029

5130
/// <summary>
5231
/// Find and return current loading Future by the url
5332
/// <param name="url">URL to the picture, web or local</param>
5433
/// </summary>
5534
/// <returns>Returns current loading Future or null if none</returns>
56-
public static Future<Sprite> GetLoadingFuture(string url) => loadingInProcess.TryGetValue(url, out var future) ? future : null;
35+
public static Future<Sprite> GetLoadingSpriteFuture<T>(string url) => Future<Sprite>.GetLoadingFuture(url);
36+
37+
/// <summary>
38+
/// Find and return current loading Future by the url
39+
/// <param name="url">URL to the picture, web or local</param>
40+
/// </summary>
41+
/// <returns>Returns current loading Future or null if none</returns>
42+
public static Future<Texture2D> GetLoadingTextureFuture<T>(string url) => Future<Texture2D>.GetLoadingFuture(url);
43+
44+
/// <summary>
45+
/// Return all current loading Futures
46+
/// </summary>
47+
/// <returns>Returns read only list of all current loading Futures</returns>
48+
public static IReadOnlyCollection<Future<Sprite>> GetLoadingSpriteFutures() => Future<Sprite>.GetLoadingFutures();
5749

5850
/// <summary>
5951
/// Return all current loading Futures
6052
/// </summary>
6153
/// <returns>Returns read only list of all current loading Futures</returns>
62-
public static IReadOnlyCollection<Future<Sprite>> GetLoadingFutures() => loadingInProcess.Values.ToList().AsReadOnly();
54+
public static IReadOnlyCollection<Future<Texture2D>> GetLoadingTextureFutures() => Future<Texture2D>.GetLoadingFutures();
6355

6456
/// <summary>
6557
/// Clear cache from Memory and Disk layers for all urls

Assets/_PackageRoot/Tests/Editor/Test.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ public virtual IEnumerator SetUp()
1313
}
1414
public virtual IEnumerator TearDown()
1515
{
16-
Assert.Zero(ImageLoader.GetLoadingFutures().Count);
16+
Assert.Zero(ImageLoader.GetLoadingSpriteFutures().Count);
17+
Assert.Zero(ImageLoader.GetLoadingTextureFutures().Count);
1718
yield return TestUtils.ClearEverything("<b>Test End </b>");
1819
}
1920
}

Assets/_PackageRoot/Tests/Editor/TestFuture.cs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,24 @@ [UnityTest] public IEnumerator GetAllLoadingFutures()
1919
ImageLoader.settings.useDiskCache = true;
2020
ImageLoader.settings.useMemoryCache = true;
2121

22-
var loadingFutures = ImageLoader.GetLoadingFutures();
23-
Assert.NotNull(loadingFutures);
24-
Debug.Log($"Loading future count={loadingFutures.Count}");
25-
foreach (var loadingFuture in loadingFutures)
22+
var loadingSpriteFutures = ImageLoader.GetLoadingSpriteFutures();
23+
Assert.NotNull(loadingSpriteFutures);
24+
Debug.Log($"Loading Future<Sprite> count={loadingSpriteFutures.Count}");
25+
foreach (var loadingFuture in loadingSpriteFutures)
2626
{
27-
Debug.Log($"Loading future: {loadingFuture.Url}, Status={loadingFuture.Status}");
27+
Debug.Log($"Loading Future<Sprite>: {loadingFuture.Url}, Status={loadingFuture.Status}");
2828
}
29-
Assert.Zero(loadingFutures.Count);
29+
Assert.Zero(loadingSpriteFutures.Count);
3030
yield return UniTask.Yield();
31+
32+
var loadingTextureFutures = ImageLoader.GetLoadingTextureFutures();
33+
Assert.NotNull(loadingTextureFutures);
34+
Debug.Log($"Loading Future<Texture2D> count={loadingTextureFutures.Count}");
35+
foreach (var loadingFuture in loadingTextureFutures)
36+
{
37+
Debug.Log($"Loading Future<Texture2D>: {loadingFuture.Url}, Status={loadingFuture.Status}");
38+
}
39+
Assert.Zero(loadingTextureFutures.Count);
3140
}
3241
[UnityTest] public IEnumerator LoadingRefAndWaiting_NoLogs() => TestUtils.RunNoLogs(LoadingRefAndWaiting);
3342
[UnityTest] public IEnumerator LoadingRefAndWaiting()

0 commit comments

Comments
 (0)