我目前在parse.com上使用unity,到目前为止对它感到非常满意,但是...现在,我想构建文件。
我试图创建这样的登录功能:
单击登录按钮后,将运行此方法:
public void GoLogin(){
string user = GameObject.Find("Login/Username").GetComponent<UIInput>().value;
string pass = GameObject.Find("Login/Password").GetComponent<UIInput>().value;
if(UserLogin(user,pass)){
Debug.Log("Login is true");
StartCoroutine(DoClose("loggedin"));
} else {
Debug.Log("login is false");
}
}
然后,我尝试使此解析调用像这样的布尔值:
public bool UserLogin(string username, string pass){
bool returnvalue = false;
ParseUser.LogInAsync(username, pass).ContinueWith(t =>
{
if (t.IsFaulted || t.IsCanceled)
{
Debug.Log ("User do not exists");
returnvalue = false;
}
else
{
Debug.Log ("User exists");
returnvalue = true;
}
});
return returnvalue;
}
这将使布尔值始终为假...我该怎么做?有可能还是我吠错了树?
任何帮助表示赞赏,并在此先感谢:-)
最佳答案
returnvalue
始终为false,因为您正在调用LogInAsync
,这是一个异步方法。这意味着任务的执行以及随后的ContinueWith
回调将在后台线程上进行。这意味着您实际上在运行return returnvalue
时按了LogInAsync
,然后才实际从操作中获得任何结果。
您可以通过在任务结束时调用Result
来强制同步执行此方法。另外,与其在其他函数中设置变量,还不如在其他函数中返回值,而是将其提供给ContinueWith
使用。
public bool UserLogin(string username, string pass){
return ParseUser.LogInAsync(username, pass).ContinueWith(t =>
{
if (t.IsFaulted || t.IsCanceled)
{
Debug.Log ("User do not exists");
return false;
}
else
{
Debug.Log ("User exists");
return true;
}
}).Result;
}
请注意,在UI线程上进行服务调用或执行阻止操作是一个坏主意,因为这会导致UI锁定并导致总体上不好的用户体验。