feifeid47 / Unity-Async-UIFrame

简单易用的Unity异步UI框架。 足够轻量,无第三方依赖。 兼容多种资源管理系统(Addressable、YooAssets等)。支持使用HybridCLR热更新。 支持自动引用。 支持对UI面板的销毁控制,使内存优化更方便。 支持子UI,子子UI,子子子UI......
Apache License 2.0
274 stars 35 forks source link

建议将 OnAssetRequest 签名改一下,返回Task #2

Closed Bian-Sh closed 1 year ago

Bian-Sh commented 1 year ago
    public static Func<Type, Task<GameObject>> OnAssetRequest;

    private static async Task<GameObject> RequestInstance(Type type)
        {
            ...
            var refInstance = await OnAssetRequest?.Invoke(type);//此处可能需要进一步判空
            ...
            return instance;
        }

使用:

using Feif.UIFramework;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    Dictionary<Type, GameObject> handles=new Dictionary<Type, GameObject>();
    void Start()
    {
        UIFrame.OnAssetRequest += OnAssetRequest;
    }

    private async Task<GameObject> OnAssetRequest(Type type)
    {
        var handle = (GameObject)null;
        if (!handles.ContainsKey(type))
        {
            handle=handles[type] ;
        }
        await Task.Yield(); // 这个演示了调用异步,与签名的 async 呼应,此处可改为资源管理的 异步api
        return handle;
    }
}

Task 默认情况下在 webgl不支持,可以取巧支持“异步” https://github.com/VolodymyrBS/WebGLThreadingPatcher/issues/3

feifeid47 commented 1 year ago

谢谢反馈,已采纳,后续更新会加上。保证Task的运行在主线程即可,可配合UniTask或其他第三方库使用

Bian-Sh commented 1 year ago

用 async await 就是为了避免回调地狱,大橘为重加油干!