Unity3D WWW调用iOS上的主线程

时间:2015-06-12 09:29:03

标签: ios multithreading unity3d

在我们正在制作的应用中,我们希望在应用暂停时尝试远程用户保存数据。在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请求,唯一的选择是将它们排队直到恢复,这是完全不可行的。

3 个答案:

答案 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)

Unity Documentation

上查看此内容

使用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);
}