我在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;
} 这将使布尔值始终为假。我该怎么做呢?有没有可能,还是我找错人了?
如有任何帮助,我们将提前表示感谢:-)
发布于 2015-04-16 05:12:25
returnvalue始终为false,因为您调用的是LogInAsync,这是一个异步方法。这意味着任务的执行和后续的ContinueWith回调将在后台线程上执行。这意味着在LogInAsync实际运行时,在您从操作中实际获得任何结果之前,您会点击return returnvalue。
您可以通过在任务结束时调用Result来强制同步执行此方法。此外,这将使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锁定并导致糟糕的用户体验。
发布于 2015-04-16 05:11:50
您可以通过等待异步操作来完成此操作。当前发生的情况是,您只是从同步方法向异步操作附加了一个延续。它立即返回,剩下的就是false布尔值。
为此,您需要将方法标记为async,并使其返回一个Task<bool>。请注意,这是异步冒泡从基础到调用堆栈顶部的事实的一部分。
public async Task<bool> LoginUserAsync(string username, string pass)
{
bool isSuccess;
try
{
await ParseUser.LogInAsync(username, pass);
isSuccess = true;
}
catch (Exception e)
{
// Log
isSuccess = false;
}
return isSuccess;
}发布于 2015-04-16 17:09:06
我建议对此使用协程,
IEnumerator UserLogin(string username,string pass){
Task task = ParseUser.LogInAsync(username, pass);
while (!task.IsCompleted) yield return null;
if (task.IsFaulted || task.IsCanceled)
{
Debug.Log("login is false");
}
else
{
Debug.Log ("User exists");
// do your log in action here
StartCoroutine(DoClose("loggedin"));
}
}https://stackoverflow.com/questions/29660093
复制相似问题