我正在编写一段代码,从MySQL获取一条信息并在UI上显示。问题是,程序不会等待MySQL查询完成并直接显示变量(由于查询结果没有按时完成而变为空)
我的代码的大致轮廓是:
bool notYetDone = true;
StartCoroutine(query(web));
IEnumerator query (WWW web){
yield return web;
while(notYetDone == true){
yield return new WaitForSeconds(1f);
if(web.error == null){
//no problems with the query, some code here
notYetDone = false;
} else if (web.error != null){
//some code here for handling errors
} else {
Debug.Log("i dont really know why we reached here");
}
}
}
我还注意到的一点是它似乎改变了notYetDone
的值并立即结束循环。我的代码有问题吗?提前谢谢。
答案 0 :(得分:2)
试试这个:
class QueryBehaviour: MonoBehaviour
{
bool queryFinished = false;
WWW wwwQuery;
IEnumerator Query()
{
wwwQuery = new WWW("url_to_query");
yield return wwwQuery;
queryFinished = true;
//results or error should be here
}
Update()
{
if( queryFinished == false )
{
return;
}
else
{
//use wwwQuery here
}
}
}
然后只需拨打查询。
注意:如果您调用 yield return wwwQuery ,则无需忙碌等待。如果你不想这样做,你应该等待,例如,你想要检查进度下载,在这种情况下你应该在定义的更新方法中查询www类的结果在 MonoBehaviour 。
答案 1 :(得分:1)
尝试:
IEnumerator query (WWW web)
{
//yield return web;
while(!web.isDone && web.Error == null)
{
//this will loop until your query is finished
//do something while waiting...
yield return null;
}
if(web.Error != null)
Debug.Log("Errors on web");
}
答案 2 :(得分:1)
在startcoroutine之前放置yield关键字也会产生相同的效果。在你的情况下:
yield StartCoroutine(query(web));
//at this point it is guaranteed to be completed
答案 3 :(得分:1)
如何使用回调?
dim a as string
dim b as string
a ="hello world"
b = IIF(a="hello world", "Yes", "No")
警告,这种方式需要使用支持 Action 类的.NET版本。