这是我的代码
public void myFuntion(){
JsonFx.Json.JsonWriter writer =new JsonFx.Json.JsonWriter();
string jsondata2=writer.Write(fps);
WWWForm form = new WWWForm();
form.AddField("facprodstrans", jsondata2);
string url="127.0.0.1/few/get_trans.php";
www = new WWW(url,form);
StartCoroutine(WaitForRequest(www));
print ("<<<<<<<<<<<<<"+fpts.time_remaining);
}
IEnumerator WaitForRequest(WWW www){
yield return www;
string facpdata = www.text;
JsonFx.Json.JsonReader reader = new JsonFx.Json.JsonReader ();
fpts = reader.Read<FactoryProdTransS> (facpdata);
print(">>>>>>>>>>>>>"+fpts.time_remaining);
} 函数'myFunction‘中的print语句在IEnumerator中的print语句之前执行,由于它先打印旧值,然后打印更新值,因此无法找出原因。
发布于 2016-04-26 15:55:11
MyFunction启动,它命中一个StartCoroutine,这是一个方法,所以它跳到那里。在这一点上,MyFunction被搁置了。
Unity做了一点自己的事情,但很少有人真正意识到,因为它发生在c++端。不知何故,您可能认为它将该方法放在协程列表中。
它开始运行WaitForRequest中的内容,直到找到一个yield为止。由于返回类型为IEnumerator,因此收益率是预期的。
当找到StartCoroutine时,它退出协程并返回到它停止的地方,因此返回到MyFunction,并在StartCoroutine之后继续。在您的情况下,它打印出来。
下一帧,Unity检查协程的假设列表,看看是否还剩下一些,在你的例子中,它会找到WaitForRequest。它返回到之前退出的地方,收益率返回。该程序查询www是否已完成,如果未完成,则与上一帧相同。如果www已完成,它将跳过输出并继续执行所有的json解析。在协程的末尾,我假设编译器在协程列表中搜索该方法并删除它,这样它就不会再次发生。
如果你需要在协程完成后执行一个动作,你需要传递一个委托:
void OnComplete(){ Debug:Log("Done"); }
IEnumerator WaitForRequest(Action onComplete){
WWW www = new WWW(url);
yield return www;
string facpdata = www.text;
JsonFx.Json.JsonReader reader = new JsonFx.Json.JsonReader ();
fpts = reader.Read<FactoryProdTransS> (facpdata);
print(">>>>>>>>>>>>>"+fpts.time_remaining);
onComplete();
}如果你需要从你的协程中得到结果,传递一个委托也是更好的方法:
IEnumerator WaitForRequest(Action<string> onComplete){
WWW www = new WWW(url);
yield return www;
string facpdata = www.text;
JsonFx.Json.JsonReader reader = new JsonFx.Json.JsonReader ();
fpts = reader.Read<FactoryProdTransS> (facpdata);
print(">>>>>>>>>>>>>"+fpts.time_remaining);
onComplete(www.text);
}
void Start(){
string text= null;
StartCoroutine(WaitForRequest(result=> text = result));
}https://stackoverflow.com/questions/36856829
复制相似问题