我正在启动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;
}
);
}
不能按预期工作,与以前相同。