Также существует проблема:
int returnInt = -1;
//This is working async so it won't lock your method, just start your Coroutine and go
StartCoroutine(RegisterUser(user, returnValue =>
{
//Inside callback
returnInt = returnValue;
}
));
//go over there where your returnInt is always -1; you should insert that log inside callback
Debug.Log(returnInt);
Короче говоря, вы должны реализовать остальную часть кода внутри этой лямбды
returnValue => {/ Здесь / };
, иначе он будет вызван до того, как ваша сопрограмма завершится
Я бы сделал это так:
public void RegisterUser(User user, System.Action<int> callback)
{
StartCoroutine(RegisterUserCoroutine(user, callback);
}
IEnumerator RegisterUserCoroutine(User user, System.Action<int> callback = null)
{
Debug.Log("a register user");
WWWForm form = new WWWForm();
using (UnityWebRequest www = UnityWebRequest.Post(BASE_URL + "userAPI.php", form))
{
yield return www.SendWebRequest();
if (www.isNetworkError || www.isHttpError)
{
//This is also bad, because default value of your callback is null, so it would throw an error
callback(1);
//This is better
callback?.Invoke(1);
}
else
{
callback(0);
}
}
}
Вы не можете получить это int в качестве возвращаемого значения , потому что вы используете асин c функцию. Таким образом, чтобы использовать этот код вместо:
int userId = RegisterUser( user );
DoSomethingWithUserId( userId );
, вы должны написать:
RegisterUser( user, DoSomethingWithUserId );