2016-06-28 11 views
0

GETリクエストから一部のデータを保存しようとしています。私はStartCoroutineを使用してリクエストし、ラムダ式を使用してデータを保存します。GETリクエストでデータを保存しない

マイコードこのです:私は、コマンドの後FINAL使用しようとすると、それが空である、

final=main.copy() 

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の値を保存する手助けはできますか?皆さんありがとう。

+0

「Debug.Log(main);」の出力は何ですか? –

+0

最終的に保存したいJSONが入っています。変数のfinalを変数finalにコピーすることはできません.PostCoroutineに最後が印刷されている場合はJSONが含まれています。その後は空です。 – user3836982

+0

エラーが発生しますか? –

答えて

3

コルーチンの実行は、多くのフレームにわたって広がっています。コルーチンがyield returnステートメントを検出すると、呼び出しメソッドに戻り、タスクが終了するまで実行を終了します。あなたのケースでは


StartDebug.Log(final)文は、すぐfirstParsingyield return www2;が実行されると実行されます。コールバックはまだ呼び出されていないので、finalは空です。

は、それが外のコールバック関数を割り当てられた後finalの値にアクセスできるようにするには、あなたはfinaltrueに設定されているboolがコールバックに割り当てられている設定する必要があります。このような何か:

StartCoroutine(firstParsing((value)=>{main = value; 
    final= main.Copy(); 
    Debug.Log(main); 
    isFinalAssigned = true; 
})); 

// In another method 
if(isFinalAssigned) 
{ 
    // Access final 
} 

あなたは上記if文が唯一の定期Updateのように呼ばれている方法に有用であることに注意する必要があります。 (OnEnableのように)一度しか呼び出されないメソッドでfinalにアクセスする場合は、finalが割り当てられるのを待たなければなりません。あなたはうち最も簡単な方法は、あなたのcallbackに(アクセス)finalを消費することである

IEnumerator DoSomethingWithFinal() 
{ 
    while(!isFinalAssigned) 
     yield return null; // Wait for next frame 
    // Do something with final 
} 

のように、このタスクのために別のコルーチンを使用することができます。

EDIT2:あなたのコメントから、次のようなことができます。メインゲームスレッドをブロックするのは良い考えではないので、にはコルーチンを使用するがあります。

private JSONObject final = null; // Make final a field 

finalを使用する場合は、次の2つのオプションがあります。

  1. ヌルチェックを使用するif(final == null) return;これは実用的でない可能性があります。
  2. finalがコルーチンに割り当てられるのを待ち、何かをコールバックとして実行します。これはあなたがきれいにしたいことをすることができる唯一の方法です。

実装については以下を参照してください。

// Calls callback after final has been assigned 
IEnumerator WaitForFinal(System.Action callback) 
{ 
    while(final == null) 
     yield return null; // Wait for next frame 
    callback(); 
} 

// This whole method depends on final. 
// This should be similar to your method set up if you have 
// good coding standards (not very long methods, each method does only 1 thing) 
void MethodThatUsesFinal() 
{ 
    if (final == null) 
    { 
     // Waits till final is assigned and calls this method again 
     StartCoroutine(WaitForFinal(MethodThatUsesFinal)); 
     return; 
    } 

    // use final 
} 
+0

私は広告変数の最終にアクセスする最も厄介な方法の例を教えてくれますか?私は最初のメソッドを使用しようとしたが、変数finalを決して割り当てない。ありがとうたくさん – user3836982

+0

StartCoroutineを呼び出すのと同じメソッドでfinal変数を使用します – user3836982

+0

コードを別のメソッドに移動することは可能ですか?ローカル変数にアクセスする必要がある場合は、アクセスしているコードをコールバックに移動できます。あなたは「最終」で何をしたいのか正確に教えていただけますか?私が述べた最初のメソッドは、 'Start'メソッドでは動作しませんが、2番目のメソッドは動作しません。 – EvilTak

関連する問題