我和parse.com使用团结,到目前为止对它非常满意,但是......现在我想构建我的文件。
我正在尝试创建一个这样的登录函数:
单击登录按钮时,将运行此方法:
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;
}
这将使布尔值始终为false ...我该怎么做?我有可能或者是在咆哮错误的树吗?
任何帮助都表示赞赏,并提前感谢: - )
答案 0 :(得分:1)
returnvalue
始终为false,因为您正在调用LogInAsync
,这是一种异步方法。这意味着任务的执行以及随后的ContinueWith
回调将在后台线程上发生。这意味着在实际运行return returnvalue
之前,您点击LogInAsync
,然后才能从操作中获得任何结果。
您可以通过在任务结束时调用Result
来强制同步执行此方法。此外,不是在ContinueWith
回调中设置变量,而是像任何其他函数一样返回值,这将使其可用于Result
。
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锁定并导致通常糟糕的用户体验。
答案 1 :(得分:0)
您可以通过等待异步操作来完成此操作。目前发生的是您只是通过同步方法将延迟附加到异步操作。它立即返回,你留下了错误的布尔值。
为了做到这一点,您需要标记方法async
并使其返回Task<bool>
。请注意,这是从调用堆栈的buttom到顶部的异步气泡的一部分。
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;
}
答案 2 :(得分:0)
我建议使用协程,
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"));
}
}