簡體   English   中英

我如何正確地阻止代碼執行直到回調

[英]How do I properly block code execution until callback

我是Unity和C#的新手,正在嘗試查詢我的Firebase實時數據庫,但是代碼並未阻止回調完成。

我嘗試實現回調,但這似乎不起作用。

static public void ReadFromDb(int level, Action<int> callback) 
{
    int return_value = -1;
    string sessionId = PlayerPrefs.GetString("SessionID");

    FirebaseDatabase.DefaultInstance.GetReference("users/"+sessionId).GetValueAsync().ContinueWith(task => {
        if (task.IsFaulted) 
        {
            // Handle the error...
            Debug.Log("Task faulted");
            callback(return_value);
        } 
        else if (task.IsCompleted) 
        {
            DataSnapshot snapshot = task.Result;
            string score_string = (snapshot.Child(level.ToString()).Value).ToString();
            Debug.Log("score_string " + score_string);
            return_value = int.Parse(score_string);
            callback(return_value);
        }
    });
}


public void LevelComplete() 
{
    DatabaseCode.writeDatabase(SceneManager.GetActiveScene().buildIndex + 1, counter);
    DatabaseCode.ReadFromDb(SceneManager.GetActiveScene().buildIndex + 1, (result) => {
        prevlevelscore = result;
        Debug.Log("result " + result.ToString());
    });
    prevscore = prevlevelscore;
    Debug.Log("Returned value: " + prevlevelscore.ToString());
    SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
}

LevelComplete()Debug.Log("Returned value: " + prevlevelscore.ToString()); prevlevelscore = result;之前執行prevlevelscore = result;
我想確保在執行Debug.Log之前已更新prevlevelscore的值。

將其余的代碼也放入回調中:

public void LevelComplete() 
{
    DatabaseCode.writeDatabase(SceneManager.GetActiveScene().buildIndex + 1, counter);
    DatabaseCode.ReadFromDb(SceneManager.GetActiveScene().buildIndex + 1, (result) => {
        Debug.Log("result " + result.ToString());
        prevscore = result;
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
    });    
}

您的問題是您的ReadFromDb方法在完成之前會返回。 您可以通過將所有代碼放入回調中來解決此問題(但是您將無法始終執行此操作),也可以使用異步等待模式。

使ReadFromDb異步:

    static public async Task ReadFromDb(int level, Action<int> callback) 
    {
        int return_value = -1;
        string sessionId = PlayerPrefs.GetString("SessionID");

        await FirebaseDatabase.DefaultInstance.GetReference("users/"+sessionId).GetValueAsync().ContinueWith(task => {
            if (task.IsFaulted) 
            {
                // Handle the error...
                Debug.Log("Task faulted");
                callback(return_value);
            } 
            else if (task.IsCompleted) 
            {
                DataSnapshot snapshot = task.Result;
                string score_string = (snapshot.Child(level.ToString()).Value).ToString();
                Debug.Log("score_string " + score_string);
                return_value = int.Parse(score_string);
                callback(return_value);
            }
        });
    }

請注意GetValueAsync().ContinueWith之前的await鍵盤操作,因為此精確代碼是異步的,如果要保留代碼執行直到獲取結果,則需要等待。

在您的呼叫者中:

    public async Task LevelComplete() 
    {
        DatabaseCode.writeDatabase(SceneManager.GetActiveScene().buildIndex + 1, counter);
        await DatabaseCode.ReadFromDb(SceneManager.GetActiveScene().buildIndex + 1, (result) => {
            prevlevelscore = result;
            Debug.Log("result " + result.ToString());
        });
        prevscore = prevlevelscore;
        Debug.Log("Returned value: " + prevlevelscore.ToString());
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
    }

該方法也將變得異步(因為異步性會傳播)。 同樣,await關鍵字將保持執行狀態,直到readFromDb方法完成。 這意味着您的數據將准備就緒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM