Parse.com查询的主线程问题

本文关键字:线程 问题 com 查询 Parse | 更新日期: 2023-09-27 18:10:31

我正在尝试使用parse.com服务与我的统一游戏。我的问题是根据从查询收到的结果实例化对象。

例如,当我运行下面的代码时;

var queryCurrent = ParseObject.GetQuery("Levels")
.WhereEqualTo("ItemId", "Character")
.WhereEqualTo("Level", "3");
queryCurrent.FirstAsync().ContinueWith(t =>
{
    Character character = ScriptableObject.CreateInstance<Character>();
});

我收到以下错误;

CreateInstanceFromType只能从主线程调用。构造函数和字段初始化函数将在加载时执行加载场景时的线程。中不要使用这个函数构造函数或字段初始化项,而不是将初始化代码移动到唤醒或启动功能。

这似乎是一个普遍的问题,每个人都试图通过使用协程找到一个解决方案。一个优化的解决方案将被欣赏。

Parse.com查询的主线程问题

使用协程在主线程上运行。它在Parse站点上有文档:https://parse.com/docs/unity_guide#tasks-coroutines

编辑:

Unity为协同多任务提供了协程的概念,允许所有代码在主线程上运行时交错运行。任务和延续模型大多独立于这种多任务机制,但很容易适应在协同程序中工作。您的协程可以简单地检查任务的IsCompleted属性,以了解异步工作是否已经完成,允许协程继续它离开的地方。例如,下面的协程代码保存一个对象,然后等待查询返回:
public IEnumerator GameOver()
{
    var gameHistory = new ParseObject("GameHistory");
    gameHistory["score"] = score;
    gameHistory["player"] = ParseUser.CurrentUser;
    var saveTask = gameHistory.SaveAsync();
    while (!saveTask.IsCompleted) yield return null;
    // When the coroutine reaches this point, the save will be complete
    var historyQuery = new ParseQuery<ParseObject>("GameHistory")
        .WhereEqualTo("player", ParseUser.CurrentUser)
        .OrderByDescending("createdAt");
    var queryTask = historyQuery.FindAsync();
    while (!queryTask.IsCompleted) yield return null;
    // The task is complete, so we can simply check for its result to get
    // the current player's game history
    var history = queryTask.Result;
}