【问题标题】:How to return value from a method that uses Firebase Tasks in Unity如何从在 Unity 中使用 Firebase 任务的方法返回值
【发布时间】:2020-07-30 00:48:06
【问题描述】:

我希望在使用回调的协程方法中完成任务后返回值。但是,我得到了奇怪的执行。

以下是代码:

 public string GetTable()
    {
        string valueToReturn = "defaultValue";
        StartCoroutine(getTable(returnedValue =>
        {
            valueToReturn = returnedValue;
            Debug.Log("Value got back from callback");
        }));
        Debug.Log("Returning Value " + valueToReturn);
        return valueToReturn;
        
    }


   IEnumerator getTable(Action<string> callBack)
    {
        var data = new Dictionary<string,object>();
        {
            data["userId"] = "nkjgfnmoaisd";
        }
        string tableId = null;
        var function = _functions.GetHttpsCallable(("matchRequest"));
        var task = function.CallAsync(data).ContinueWithOnMainThread((callTask) =>
        {
            if (callTask.IsFaulted)
            {
               Debug.LogError("An error...");
               return;
            }
            var result = (IDictionary) callTask.Result.Data;
            tableId = (string) result["tableId"];
            
            Debug.Log("I am being called after done :)");
            Debug.Log(tableId);
            callBack(tableId);
        });
        yield return new WaitUntil( () => task.IsCompleted);
    }

预期输出:

  1. 完成后有人打电话给我 :)
  2. FNIIUSHDF(表 ID)
  3. 从回调中取回的值
  4. 返回值 FNIIUSHDF

电流输出:

  1. 返回值 defaultValue
  2. 完成后有人打电话给我 :)
  3. FNIIUSHDF
  4. 从回调中取回的值

【问题讨论】:

    标签: c# firebase unity3d asynchronous task


    【解决方案1】:

    启动协程 (StartCoroutine) 确实不会延迟调用它的方法。

    如果不冻结 Unity 主线程(这正是您通常不想要的),就无法直接从方法中返回值。希望是有道理的 - 你不能立即返回你必须先等待的东西。

    您应该 - 正如您已经做过的那样 - 坚持回调并在回调中执行您想要对值执行的任何操作。

    public void GetTable(Action<string> result)
    {
        string valueToReturn = "defaultValue";
        StartCoroutine(getTable(returnedValue =>
        {
            valueToReturn = returnedValue;
            Debug.Log("Value got back from callback");
            Debug.Log("Returning Value " + valueToReturn);
    
            result?.Invoke();
        }));
    }
    

    因此,无论何时调用此方法,您都将再次添加一个回调来处理结果应该发生的情况。

    而不是

    var result = GetTable();
    DoSomething();
    

    相当使用

    GetTable(result => 
    { 
        DoSomething(); 
    });
    

    实际上ContinueWithOnMainThread 也应该已经注意回调是在 Unity 主线程中执行的......实际上不需要为它启动协程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多