Skip to content

Commit d290d94

Browse files
committed
Update Unity dependencies and refactor ImageLoader for improved error handling and code clarity
1 parent 3ac5f77 commit d290d94

File tree

6 files changed

+140
-65
lines changed

6 files changed

+140
-65
lines changed

Assets/_PackageRoot/Runtime/Future/Future.cs

Lines changed: 44 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -96,18 +96,33 @@ internal Future<T> PassEvents(Future<T> to, bool passCancelled = true, bool pass
9696
internal void Loading(FutureLoadingFrom loadingFrom)
9797
{
9898
if (cleared || IsCancelled) return;
99-
Status = loadingFrom switch
99+
100+
switch(loadingFrom)
100101
{
101-
FutureLoadingFrom.DiskCache => FutureStatus.LoadingFromDiskCache,
102-
FutureLoadingFrom.Source => FutureStatus.LoadingFromSource,
103-
_ => throw new ArgumentException($"Unsupported FutureLoadingFrom with value = '{loadingFrom}' in LoadingFrom")
104-
};
105-
var onLoadingEvent = loadingFrom switch
102+
case FutureLoadingFrom.DiskCache:
103+
Status = FutureStatus.LoadingFromDiskCache;
104+
OnLoadingFromDiskCache?.Invoke();
105+
break;
106+
case FutureLoadingFrom.Source:
107+
Status = FutureStatus.LoadingFromSource;
108+
OnLoadingFromSource?.Invoke();
109+
break;
110+
default:
111+
throw new ArgumentException($"Unsupported FutureLoadingFrom with value = '{loadingFrom}' in LoadingFrom");
112+
}
113+
114+
Action onLoadingEvent;
115+
switch (loadingFrom)
106116
{
107-
FutureLoadingFrom.DiskCache => OnLoadingFromDiskCache,
108-
FutureLoadingFrom.Source => OnLoadingFromSource,
109-
_ => throw new ArgumentException($"Unsupported FutureLoadingFrom with value = '{loadingFrom}' in LoadingFrom")
110-
};
117+
case FutureLoadingFrom.DiskCache:
118+
onLoadingEvent = OnLoadingFromDiskCache;
119+
break;
120+
case FutureLoadingFrom.Source:
121+
onLoadingEvent = OnLoadingFromSource;
122+
break;
123+
default:
124+
throw new ArgumentException($"Unsupported FutureLoadingFrom with value = '{loadingFrom}' in LoadingFrom");
125+
}
111126

112127
if (ImageLoader.settings.debugLevel <= DebugLevel.Log && !muteLogs)
113128
Debug.Log($"[ImageLoader] Future[id={id}] Loading: {Url}, from: {loadingFrom}");
@@ -117,21 +132,27 @@ internal void Loading(FutureLoadingFrom loadingFrom)
117132
internal void Loaded(T value, FutureLoadedFrom loadedFrom)
118133
{
119134
if (cleared || IsCancelled) return;
135+
120136
this.value = value;
121-
Status = loadedFrom switch
122-
{
123-
FutureLoadedFrom.MemoryCache => FutureStatus.LoadedFromMemoryCache,
124-
FutureLoadedFrom.DiskCache => FutureStatus.LoadedFromDiskCache,
125-
FutureLoadedFrom.Source => FutureStatus.LoadedFromSource,
126-
_ => throw new ArgumentException($"Unsupported FutureLoadedFrom with value = '{loadedFrom}' in Loaded")
127-
};
128-
var onLoadedEvent = loadedFrom switch
137+
138+
Action<T> onLoadedEvent;
139+
switch(loadedFrom)
129140
{
130-
FutureLoadedFrom.MemoryCache => OnLoadedFromMemoryCache,
131-
FutureLoadedFrom.DiskCache => OnLoadedFromDiskCache,
132-
FutureLoadedFrom.Source => OnLoadedFromSource,
133-
_ => throw new ArgumentException($"Unsupported FutureLoadedFrom with value = '{loadedFrom}' in Loaded")
134-
};
141+
case FutureLoadedFrom.MemoryCache:
142+
Status = FutureStatus.LoadedFromMemoryCache;
143+
onLoadedEvent = OnLoadedFromMemoryCache;
144+
break;
145+
case FutureLoadedFrom.DiskCache:
146+
Status = FutureStatus.LoadedFromDiskCache;
147+
onLoadedEvent = OnLoadedFromDiskCache;
148+
break;
149+
case FutureLoadedFrom.Source:
150+
Status = FutureStatus.LoadedFromSource;
151+
onLoadedEvent = OnLoadedFromSource;
152+
break;
153+
default:
154+
throw new ArgumentException($"Unsupported FutureLoadedFrom with value = '{loadedFrom}' in Loaded");
155+
}
135156

136157
if (ImageLoader.settings.debugLevel <= DebugLevel.Log && !muteLogs)
137158
Debug.Log($"[ImageLoader] Future[id={id}] Loaded: {Url}, from: {loadedFrom}");

Assets/_PackageRoot/Runtime/ImageLoader.LoadSprite.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ static async void InternalLoadSprite(Future<Sprite> future, Vector2 pivot, Textu
183183
#if UNITY_2020_1_OR_NEWER
184184
var isError = future.WebRequest.result != UnityWebRequest.Result.Success;
185185
#else
186-
var isError = future.WebRequest.isNetworkError || request.isHttpError;
186+
var isError = future.WebRequest.isNetworkError || future.WebRequest.isHttpError;
187187
#endif
188188
if (isError)
189189
{

Assets/_PackageRoot/Runtime/ImageLoader.MemoryCache.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public static partial class ImageLoader
88
{
99
internal static volatile Dictionary<string, Sprite> memorySpriteCache = new Dictionary<string, Sprite>();
1010

11-
#if UNITY_EDITOR
11+
#if UNITY_EDITOR && UNITY_2019_3_OR_NEWER
1212
[UnityEditor.InitializeOnEnterPlayMode]
1313
private static void ClearMemoryCacheOnEnterPlayMode()
1414
{
@@ -53,7 +53,7 @@ public static void SaveToMemoryCache(string url, Sprite sprite, bool replace = f
5353
/// </summary>
5454
/// <param name="url">URL to the picture, web or local</param>
5555
/// <returns>Returns null if not allowed to use Memory cache or if there is no cached Sprite</returns>
56-
public static Reference<Sprite>? LoadFromMemoryCacheRef(string url)
56+
public static Reference<Sprite> LoadFromMemoryCacheRef(string url)
5757
{
5858
if (!settings.useMemoryCache) return null;
5959

@@ -68,7 +68,7 @@ public static void SaveToMemoryCache(string url, Sprite sprite, bool replace = f
6868
/// </summary>
6969
/// <param name="url">URL to the picture, web or local</param>
7070
/// <returns>Returns null if not allowed to use Memory cache or if there is no cached Sprite</returns>
71-
public static Sprite? LoadFromMemoryCache(string url)
71+
public static Sprite LoadFromMemoryCache(string url)
7272
{
7373
if (!settings.useMemoryCache) return null;
7474

Assets/_PackageRoot/Tests/Editor/TestFuture.cs

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ [UnityTest] public IEnumerator Loading2RefAndCancelFirst()
103103
Assert.IsNotNull(ref2);
104104
Assert.IsNotNull(ref2.Value);
105105
Assert.AreEqual(1, Reference<Sprite>.Counter(url1));
106+
future1.Dispose();
107+
future2.Dispose();
108+
ref2.Dispose();
106109
}
107110
[UnityTest] public IEnumerator Loading2RefAndWaitNoLogs()
108111
{
@@ -281,7 +284,7 @@ [UnityTest] public IEnumerator EventLoadedFromMemoryCacheCalled()
281284
{
282285
var sprite = default(Sprite);
283286
var startTime = DateTime.Now;
284-
using var future1 = ImageLoader.LoadSprite(url)
287+
var future1 = ImageLoader.LoadSprite(url)
285288
.LoadedFromMemoryCache(x => sprite = x);
286289

287290
var task1 = future1.AsTask();
@@ -294,6 +297,8 @@ [UnityTest] public IEnumerator EventLoadedFromMemoryCacheCalled()
294297

295298
while (!task1.IsCompleted)
296299
yield return null;
300+
301+
future1.Dispose();
297302
}
298303
}
299304
[UnityTest] public IEnumerator EventLoadedFromMemoryCacheNotCalledBecauseOfCancelNoLogs()
@@ -311,7 +316,7 @@ [UnityTest] public IEnumerator EventLoadedFromMemoryCacheNotCalledBecauseOfCance
311316
{
312317
var sprite = default(Sprite);
313318
var startTime = DateTime.Now;
314-
using var future1 = ImageLoader.LoadSprite(url)
319+
var future1 = ImageLoader.LoadSprite(url)
315320
.LoadedFromMemoryCache(x => sprite = x);
316321

317322
var task1 = future1.AsTask();
@@ -324,6 +329,8 @@ [UnityTest] public IEnumerator EventLoadedFromMemoryCacheNotCalledBecauseOfCance
324329
}
325330
yield return UniTask.Delay(1000).ToCoroutine();
326331
Assert.IsNull(sprite);
332+
333+
future1.Dispose();
327334
}
328335
}
329336
[UnityTest] public IEnumerator EventLoadedFromDiskCalledNoLogs()
@@ -341,7 +348,7 @@ [UnityTest] public IEnumerator EventLoadedFromDiskCalled()
341348
{
342349
var sprite = default(Sprite);
343350
var startTime = DateTime.Now;
344-
using var future1 = ImageLoader.LoadSprite(url)
351+
var future1 = ImageLoader.LoadSprite(url)
345352
.LoadedFromDiskCache(x => sprite = x);
346353

347354
var task1 = future1.AsTask();
@@ -354,6 +361,8 @@ [UnityTest] public IEnumerator EventLoadedFromDiskCalled()
354361

355362
while (!task1.IsCompleted)
356363
yield return null;
364+
365+
future1.Dispose();
357366
}
358367
}
359368
[UnityTest] public IEnumerator EventLoadedFromDiskNotCalledBecauseOfCancelNoLogs()
@@ -371,7 +380,7 @@ [UnityTest] public IEnumerator EventLoadedFromDiskNotCalledBecauseOfCancel()
371380
{
372381
var sprite = default(Sprite);
373382
var startTime = DateTime.Now;
374-
using var future1 = ImageLoader.LoadSprite(url)
383+
var future1 = ImageLoader.LoadSprite(url)
375384
.LoadedFromDiskCache(x => sprite = x);
376385

377386
var task1 = future1.AsTask();
@@ -384,6 +393,8 @@ [UnityTest] public IEnumerator EventLoadedFromDiskNotCalledBecauseOfCancel()
384393
}
385394
yield return UniTask.Delay(1000).ToCoroutine();
386395
Assert.IsNull(sprite);
396+
397+
future1.Dispose();
387398
}
388399
}
389400
[UnityTest] public IEnumerator EventLoadedFromSourceCalledNoLogs()
@@ -401,7 +412,7 @@ [UnityTest] public IEnumerator EventLoadedFromSourceCalled()
401412
{
402413
var sprite = default(Sprite);
403414
var startTime = DateTime.Now;
404-
using var future1 = ImageLoader.LoadSprite(url)
415+
var future1 = ImageLoader.LoadSprite(url)
405416
.LoadedFromSource(x => sprite = x);
406417

407418
var task1 = future1.AsTask();
@@ -414,6 +425,8 @@ [UnityTest] public IEnumerator EventLoadedFromSourceCalled()
414425

415426
while (!task1.IsCompleted)
416427
yield return null;
428+
429+
future1.Dispose();
417430
}
418431
}
419432
[UnityTest] public IEnumerator EventLoadedFromSourceNotCalledBecauseOfCancelNoLogs()
@@ -431,7 +444,7 @@ [UnityTest] public IEnumerator EventLoadedFromSourceNotCalledBecauseOfCancel()
431444
{
432445
var sprite = default(Sprite);
433446
var startTime = DateTime.Now;
434-
using var future1 = ImageLoader.LoadSprite(url)
447+
var future1 = ImageLoader.LoadSprite(url)
435448
.LoadedFromSource(x => sprite = x);
436449

437450
var task1 = future1.AsTask();
@@ -444,6 +457,8 @@ [UnityTest] public IEnumerator EventLoadedFromSourceNotCalledBecauseOfCancel()
444457
}
445458
yield return UniTask.Delay(1000).ToCoroutine();
446459
Assert.IsNull(sprite);
460+
461+
future1.Dispose();
447462
}
448463
}
449464
[UnityTest] public IEnumerator EventLoadingFromDiskCacheCalledNoLogs()
@@ -462,7 +477,7 @@ [UnityTest] public IEnumerator EventLoadingFromDiskCacheCalled()
462477
yield return ImageLoader.LoadSprite(url).AsUniTask().ToCoroutine();
463478
var called = false;
464479
var startTime = DateTime.Now;
465-
using var future1 = ImageLoader.LoadSprite(url)
480+
var future1 = ImageLoader.LoadSprite(url)
466481
.LoadingFromDiskCache(() => called = true);
467482

468483
var task1 = future1.AsTask();
@@ -477,6 +492,7 @@ [UnityTest] public IEnumerator EventLoadingFromDiskCacheCalled()
477492
yield return null;
478493

479494
Assert.IsTrue(called);
495+
future1.Dispose();
480496
}
481497
}
482498
[UnityTest] public IEnumerator EventLoadingFromDiskCacheCalledImmediatelyNoLogs()
@@ -495,7 +511,7 @@ [UnityTest] public IEnumerator EventLoadingFromDiskCacheCalledImmediately()
495511
yield return ImageLoader.LoadSprite(url).AsUniTask().ToCoroutine();
496512
var called = false;
497513
var startTime = DateTime.Now;
498-
using var future1 = ImageLoader.LoadSprite(url)
514+
var future1 = ImageLoader.LoadSprite(url)
499515
.LoadingFromDiskCache(() => called = true);
500516

501517
Assert.IsTrue(called);
@@ -512,6 +528,7 @@ [UnityTest] public IEnumerator EventLoadingFromDiskCacheCalledImmediately()
512528
Assert.IsTrue(called);
513529
yield return UniTask.Delay(1000).ToCoroutine();
514530
Assert.IsTrue(called);
531+
future1.Dispose();
515532
}
516533
}
517534
[UnityTest] public IEnumerator EventLoadingFromSourceCalledNoLogs()
@@ -529,7 +546,7 @@ [UnityTest] public IEnumerator EventLoadingFromSourceCalled()
529546
{
530547
var called = false;
531548
var startTime = DateTime.Now;
532-
using var future1 = ImageLoader.LoadSprite(url)
549+
var future1 = ImageLoader.LoadSprite(url)
533550
.LoadingFromSource(() => called = true);
534551

535552
var task1 = future1.AsTask();
@@ -544,6 +561,7 @@ [UnityTest] public IEnumerator EventLoadingFromSourceCalled()
544561
yield return null;
545562

546563
Assert.IsTrue(called);
564+
future1.Dispose();
547565
}
548566
}
549567
[UnityTest] public IEnumerator EventLoadingFromSourceCalledImmediatelyNoLogs()
@@ -561,7 +579,7 @@ [UnityTest] public IEnumerator EventLoadingFromSourceCalledImmediately()
561579
{
562580
var called = false;
563581
var startTime = DateTime.Now;
564-
using var future1 = ImageLoader.LoadSprite(url)
582+
var future1 = ImageLoader.LoadSprite(url)
565583
.LoadingFromSource(() => called = true);
566584

567585
Assert.IsTrue(called);
@@ -576,6 +594,7 @@ [UnityTest] public IEnumerator EventLoadingFromSourceCalledImmediately()
576594
}
577595
yield return UniTask.Delay(1000).ToCoroutine();
578596
Assert.IsTrue(called);
597+
future1.Dispose();
579598
}
580599
}
581600
[UnityTest] public IEnumerator EventFailedWithIncorrectUrlAndTimeoutNoLogs()
@@ -592,7 +611,7 @@ [UnityTest] public IEnumerator EventFailedWithIncorrectUrlAndTimeout()
592611
var url = IncorrectImageURL;
593612
var exception = default(Exception);
594613
var startTime = DateTime.Now;
595-
using var future1 = ImageLoader.LoadSprite(url)
614+
var future1 = ImageLoader.LoadSprite(url)
596615
.Timeout(TimeSpan.FromSeconds(0.5f))
597616
.Failed(e => exception = e);
598617

@@ -606,6 +625,7 @@ [UnityTest] public IEnumerator EventFailedWithIncorrectUrlAndTimeout()
606625
future1.Cancel();
607626
LogAssert.ignoreFailingMessages = false;
608627
yield return UniTask.Delay(TimeSpan.FromSeconds(2)).ToCoroutine();
628+
future1.Dispose();
609629
}
610630
[UnityTest] public IEnumerator EventFailedWithIncorrectUrlNotCalledBecauseOfCancelNoLogs()
611631
{
@@ -621,7 +641,7 @@ [UnityTest] public IEnumerator EventFailedWithIncorrectUrlNotCalledBecauseOfCanc
621641
var url = IncorrectImageURL;
622642
var exception = default(Exception);
623643
var startTime = DateTime.Now;
624-
using var future1 = ImageLoader.LoadSprite(url)
644+
var future1 = ImageLoader.LoadSprite(url)
625645
.Failed(e => exception = e);
626646

627647
Assert.IsNull(exception);
@@ -636,6 +656,7 @@ [UnityTest] public IEnumerator EventFailedWithIncorrectUrlNotCalledBecauseOfCanc
636656
}
637657
yield return UniTask.Delay(1000).ToCoroutine();
638658
Assert.IsNull(exception);
659+
future1.Dispose();
639660
}
640661
[UnityTest] public IEnumerator AsyncOperationCompletionNoLogs()
641662
{
@@ -676,7 +697,7 @@ [UnityTest] public IEnumerator AsyncOperationCompletionAfterCancel()
676697
var completed = false;
677698
var cancelled = false;
678699
var startTime = DateTime.Now;
679-
using var future = ImageLoader.LoadSprite(url)
700+
var future = ImageLoader.LoadSprite(url)
680701
.Completed(success => completed = true)
681702
.Canceled(() => cancelled = true);
682703

@@ -703,6 +724,7 @@ [UnityTest] public IEnumerator AsyncOperationCompletionAfterCancel()
703724
Assert.IsFalse(completed);
704725
Assert.IsTrue(cancelled);
705726
yield return UniTask.Delay(TimeSpan.FromSeconds(1)).ToCoroutine();
727+
future.Dispose();
706728
}
707729
}
708730
}

0 commit comments

Comments
 (0)