GetFileAsync不调用StorageProgress报告功能

时间:2017-04-27 11:16:34

标签: c# firebase unity3d firebase-storage

我正在尝试从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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

尝试使用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++;
        }
    }
}