仅在StartCoroutine完成统一后返回

时间:2018-06-23 14:24:41

标签: c# unity3d coroutine

我有一些代码需要从Web服务器请求一些数据。我在具有一些参数并应返回返回数据的函数中执行此操作。参见下面的代码:

public string[] GetDBValues(int type, string[] data){
    string base_url = "http://localhost/artez/onderzoeks_opdracht/interface_test/get_elements.php";
    string typePrefix = "?type=";
    string dataPrefix = "data[]=";
    string uriString = base_url + typePrefix + type;
    foreach (string dataElement in data){
        uriString += "&" + dataPrefix + dataElement;
    }
    string[] db_objects = null;
    StartCoroutine(UrlData(uriString, (result) =>{
        string clean_data = Regex.Replace(result, @"[""\[\]]", "");
        db_objects = clean_data.Split(',');

    }));
    return db_objects;
}

但是当我运行这段代码时,返回的数据为空,因为返回的数据为空数组,然后再将其填充为来自Web服务器的数据。我该如何做才能使数据仅在Web请求完成后才返回?

我尝试在StartCoroutine中设置返回值,但是该函数无法编译。

如果不清楚,请告诉我,以便我澄清!

1 个答案:

答案 0 :(得分:0)

您需要回调以将值传递出方法。

public void GetDBValues(int type, string[] data, 
     Action<string[]> returnMethod) // Extra parameter
{
    // Same code here
    StartCoroutine(UrlData(uriString, (result) =>{
        string clean_data = Regex.Replace(result, @"[""\[\]]", "");
        db_objects = clean_data.Split(',');
        returnMethod(de_objects);  // Here it returns
    }));
}

所以你这样打电话:

string result = GetDBValues(0, new string[]{"a"});

现在您这样打电话:

string result = null;
GetDBValues(0, new string[]{"a"}, (str)=>{ result = str});

现在,这已相当简化。因为您的代码不会在GetDBValues调用时暂停,所以它可能会更复杂,但是考虑到您有一个Text字段,那么您将按以下方式进行操作:

Text text;
void Start()
{
    text.text = "N/A";
    GetDBValues(0, new string[]{ "a" }, (strs)=> 
    { 
         if(strs == null)
         { 
            text.text = "Something went wruung"; 
            return; 
         }
         // print concatenated version of the result
         for(int i = 0; i < strs.Length;i++){ text.text += strs[i]; }
         });
}

这样,文本将以“ N / A”开头,下载完成后将更改为适当的值。