我正在尝试从GET请求中保存一些数据。我使用StartCoroutine来请求并使用Lambda表达式来保存数据。
我的代码是这样的:
Using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
// Use this for initialization
public void Start () {
string url1 = "http://localhost/virtualTV/query/?risorsa=";
string ciao = "http://desktop-pqb3a65:8080/marmotta/resource/ef299b79-35f2-4942-a33b-7e4d7b7cbfb5";
url1 = url1 + ciao;
WWW www1 = new WWW(url1);
var main=new JSONObject(JSONObject.Type.OBJECT);
var final= new JSONObject(JSONObject.Type.OBJECT);;
StartCoroutine(firstParsing((value)=>{main = value;
final= main.Copy();
Debug.Log(main);
}));
Debug.Log(final);
}
public IEnumerator firstParsing( System.Action<JSONObject> callback)
{
string url2 = "http://localhost/virtualTV/FirstQuery/?risorsa=";
string ciao = "http://desktop-pqb3a65:8080/marmotta/resource/ef299b79-35f2-4942-a33b-7e4d7b7cbfb5";
url2 = url2 + ciao;
WWW www2 = new WWW(url2);
yield return www2;
string json = www2.text;
//Parsing del json con creazione di un array
var firstjson = new JSONObject(json);
var tempVideo = new JSONObject(JSONObject.Type.OBJECT);
var array2 = new JSONObject(JSONObject.Type.OBJECT);
tempVideo.AddField ("id", firstjson.GetField ("id"));
tempVideo.AddField ("type", firstjson.GetField ("type"));
tempVideo.AddField ("url", firstjson.GetField ("url"));
array2.Add (tempVideo);
yield return array2;
callback (array2);
Debug.Log ("First Run" + array2);
}
当我在命令后尝试使用FINAL时,
final=main.copy()
它是空的。你能帮助我保存变量final中的值吗?谢谢大家。
答案 0 :(得分:3)
协程的执行分布在许多帧中。当协程遇到yield return
语句时,它返回到调用方法,该方法完成执行,直到任务完成。
在您的情况下,Debug.Log(final)
中的Start
语句会在yield return www2;
中firstParsing
执行后立即执行。回调还没有被调用,这就是final
为空的原因。
为了能够在{em>外部回调函数分配后final
中访问该值,您必须设置bool
,其设置为{{ 1}}在回调中分配true
之后。像这样:
final
您必须注意,上述StartCoroutine(firstParsing((value)=>{main = value;
final= main.Copy();
Debug.Log(main);
isFinalAssigned = true;
}));
// In another method
if(isFinalAssigned)
{
// Access final
}
语句仅对定期调用的方法有用,例如if
。如果您在仅被调用一次的方法(例如Update
)中访问final,则必须等待OnEnable
被分配。您可以使用其他协同程序执行此任务,例如
final
最简单的方法是在IEnumerator DoSomethingWithFinal()
{
while(!isFinalAssigned)
yield return null; // Wait for next frame
// Do something with final
}
中使用(访问)final
。
EDIT2:根据您的评论,您可以执行以下操作。您将拥有来使用协同程序,因为阻止主游戏线程并不是一个好主意。
callback
无论您在何处使用private JSONObject final = null; // Make final a field
,都有两种选择。
final
这可能不切实际。if(final == null) return;
并执行回调操作。这是你能干净利落的唯一方法。 请看下面的实施。
final