GET请求不保存数据

时间:2016-06-28 12:52:07

标签: c# unity3d coroutine

我正在尝试从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中的值吗?谢谢大家。

1 个答案:

答案 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 ,都有两种选择。

  1. 使用空检查final这可能不切实际。
  2. 等待在协程中分配if(final == null) return;并执行回调操作。这是你能干净利落的唯一方法。
  3. 请看下面的实施。

    final