在我们正在制作的应用中,我们希望在应用暂停时尝试远程用户保存数据。在Unity的编辑器和Android上,这就像
一样简单WWW www = new WWW(_URL);
while(!www.isDone)
{
Thread.Sleep(100);
}
Debug.Log(www.text);
(完整样本:https://github.com/SixMinute/iOSWWWGet)
但是在iOS上,www.isDone
在我们阻止时永远不会评估为true,所以整个事情都会挂起。
这是一个错误,还是设计?然后,如果它是设计的,那么正确的方法是什么,因为如果我们把它放在StartCoroutine
之后,它在主线程上没有正确,并且在暂停,当应用程序恢复时会发生什么事情(这完全违背了我们正在尝试做的目的)。
编辑:在与IRC上的一些Unity开发人员交谈后,他们接受这实际上是代码中的一个错误,了解我需要这个的原因,并接受需要有一种同步触发WWW请求的方法,或者在iOS上的OnApplicationPause(true)
流程中调用时启用此功能的其他方式,因为否则(尽管能够轻松地在本地执行),当时无法触发WWW请求,唯一的选择是将它们排队直到恢复,这是完全不可行的。
答案 0 :(得分:1)
此时Unity至少在某些平台(iOS,webplayer)上没有为www动作启动新线程。或者如果是,它在主线程上设置WWW.isDone。所以这段代码:
while(!www.isDone)
Thread.Sleep(500);
不起作用。
答案 1 :(得分:1)
以您想要的任何方式开始您的www通话。在更新期间,检查www.isDone ...如果返回true,则对其进行操作......否则通过。
private List<WWW> myRequests = new List<WWW>()
void Update()
{
if (myRequests.Count > 0)
{
List<WWW> removeList = null;
foreach (WWW myRequest in myRequests)
{
if (myRequest.isDone)
{
// process request here
if (removeList == null)
{
removeList = new List<WWW>();
}
removeList.Add(myRequest);
}
}
if (removeList != null)
{
foreach (WWW oldReq in removeList)
{
myRequests.Remove(oldReq);
}
}
}
}
如果您想支持一次触发多个www请求,请将您的www请求放入数组列表myRequests = new List()并循环浏览更新中的请求,并检查每个请求的状态。您在使用时无法从myRequests中删除,请注意临时删除列表。
$(".btn").on("click",function(){
alert($(this).html());
});
答案 2 :(得分:-1)
使用Coroutine,while循环将在网络播放器上被阻止:
void SaveDate()
{
StartCoroutine("SaveWebData");
}
IEnumerator SaveWebData()
{
// Start a download of the given URL
WWW www = new WWW(_URL);
// Wait for download to complete
yield return www;
// Completed!
Debug.Log(www.text);
}