如何在Unity中处理WWW请求的大响应?

时间:2017-05-10 12:06:47

标签: c# string unity3d

我正在启动WWW get请求,并在收到响应后,我想将收到的字符串解析为JSON。问题是由于响应的大小非常大,使用www.text获取响应字符串会阻止UI。

我已经尝试将www.text方法放在另一个线程上,但是Unity不是线程安全的,当我尝试访问www.text时我得到了一个例外。

是否有其他方法可以从www请求中获取字符串?

编辑:这不是困扰我的请求的速度(例如下载文件需要多长时间),而是从完成的WWW对象获取字符串所需的时间。 我已经尝试在协程中执行此操作,但是我相信WWW.text是一个原子操作,也就是说你不能在多个帧上执行它。

EDIT2: 码: coroutine启动请求

sender.StartCoroutine(GetSessionWithPositions(sender, URL));

static IEnumerator GetSessionWithPositions(UI.HistoryTableViewController sender, string URL) {
        WWW request = new WWW(URL);
        yield return request;
        isMakingARequest = false;
        if (string.IsNullOrEmpty(request.error)) {
            Debug.Log(Time.time.ToString());
            sender.ReceivedShotsPosition(request);
        } else {
            Debug.Log("GetSessionWithPositionsRequest failed with error: " + request.error);
        }
    }

启动反序列化线程的代码

public void ReceivedShotsPosition(WWW request) {
            Thread deserializeThread = new Thread(new ParameterizedThreadStart(Deserialize));
            deserializeThread.Start((request as object));
            StartCoroutine(CheckIfDone());
        }

处理请求的代码

private void Deserialize(object request) {
            WWW wwwObject = request as WWW;
            JSONObjects.Session session = Utility.JsonHelper.DeserializeJSON<JSONObjects.Session>(wwwObject.text);
            int index = 0;
            dataSource = new Models.ShotDataObject[session.Shots.Length];
            foreach (JSONObjects.Shot JSONShot in session.Shots) {
                dataSource[index++] = new Models.ShotDataObject(JSONShot);
            }
            finishedSerializing = true;
        }

如果设置为true,CheckIsDone协程只会检查bool并更新UI。

EDIT3:响应是一个JSON字符串。

EDIT4:UnityThread变体

private void Deserialize(object json) {
            WWW request = json as WWW;
            string jsonString;
            UnityThread.executeInUpdate(() => {
                jsonString = request.text;
                JSONObjects.Session session = Utility.JsonHelper.DeserializeJSON<JSONObjects.Session>(jsonString);
                int index = 0;
                dataSource = new Models.ShotDataObject[session.Shots.Length];
                foreach (JSONObjects.Shot JSONShot in session.Shots) {
                    dataSource[index++] = new Models.ShotDataObject(JSONShot);
                }
                finishedSerializing = true;
            }
            );

        }

不能按预期工作,与以前相同。

0 个答案:

没有答案