我目前在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锁定并导致总体上不好的用户体验。

08-24 22:15