试图用parse.com异步制作bool

时间:2015-04-15 20:18:42

标签: c# unity3d parse-platform

我和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 ...我该怎么做?我有可能或者是在咆哮错误的树吗?

任何帮助都表示赞赏,并提前感谢: - )

3 个答案:

答案 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"));
    }
}

Check out parse documentation for more information