GetFileAsync 不调用 StorageProgress 报告函数

StorageProgress Report function is not called by GetFileAsync

我正在尝试从 Firebase 存储下载我的游戏的资源文件,并显示下载进度。但是我发现 GetFileAsync 函数的行为很奇怪。 StorageProgress 的 Report 函数在文件下载过程中不会定期调用,参考文献中有描述。在将文件放入内存(下载)后,在保存到磁盘期间调用报告函数。我做错了什么?

    string resourcesURL = "URL_TO_RESOURCE_FILE"; // https://firebasestorage.googleapis.com/......    
    public void UpdateProgress(float val)
    {
        labelProgress.text = Mathf.RoundToInt(val * 100f) + "%";
        circleProgress.fillAmount = val;
    }

    void OnDownloadClick()
    {
        SetDownloadingView();
        string saveToPath = GetParentFolder() + "/resources.bin";

        StorageReference fileRef = FirebaseBackend.Instance.GetStorage().GetReferenceFromUrl(resourcesURL);

        StorageProgress<Firebase.Storage.DownloadState> progressHandler = new StorageProgress<Firebase.Storage.DownloadState>(state =>
        {
            Debug.Log(String.Format ("Progress: {0} of {1} bytes transferred.", state.BytesTransferred, state.TotalByteCount));

            UpdateProgress(state.BytesTransferred / state.TotalByteCount);
        });

        Task dwnTask = fileRef.GetFileAsync
        (
            saveToPath, 
            progressHandler, 
            CancellationToken.None
        );

        dwnTask.ContinueWith(resultTask => 
        {
            if (!resultTask.IsFaulted && !resultTask.IsCanceled) 
            {
                ResetView();
                Debug.Log("Download finished!");
            }
            else
            {
                ResetView();
                Debug.Log("Download fail!");
            }
        });
    }

Unity版本为5.5.0f3 Firebase Unity SDK 版本为 3.0.1

你可能根本没有做错任何事。

根据 this post,这是一个 Firebase 错误,将在下一次 Firebase 更新中解决。

尝试使用 IEnumerator,这是我的存储进度工作代码:

protected IEnumerator downloadObject(string target_file, string target_path, int item_index)
{
    if (target_file != "")
    {
        FirebaseStorage storage = FirebaseStorage.DefaultInstance;

        string local_url = target_path.Replace("\", "/").Replace("//", "/");
        StorageReference storage_ref =
            storage.GetReferenceFromUrl(FB_Conf.gsURL + target_file);

        Task task = null;
        try
        {
            task = storage_ref.GetFileAsync(local_url,
                new Firebase.Storage.StorageProgress<DownloadState>((DownloadState state) =>
            {
            // called periodically during the download
                long tbyte = state.TotalByteCount;
                file_progress = (float)state.BytesTransferred / (float)tbyte;
            }), CancellationToken.None);
        }
        catch (Exception exc)
        {                
            Debug.Log("Get file async error: " + exc.Message);
        }

        if (task != null)
        {
            yield return new WaitUntil(() => task.IsCompleted);
            task.ContinueWith((resultTask) =>
            {
                if ((resultTask.IsFaulted) || (resultTask.IsCanceled))
                {
                    error_count++;
                    string msg = (resultTask.IsCanceled) ? "Download error." : "";
                    if ((resultTask.Exception != null) &&
                        (resultTask.Exception.InnerExceptions.Count > 0) &&
                        (resultTask.Exception.InnerExceptions[0] is Firebase.Storage.StorageException))
                        msg = ((Firebase.Storage.StorageException)resultTask.Exception.InnerExceptions[0]).HttpResultCode.ToString();
                    else if (resultTask.Exception != null)
                        msg = resultTask.Exception.Message;                        
                }
            });
        }
        else
        {
            error_count++;
        }
    }
}