Parse.com查询的主要线程问题

时间:2014-06-26 22:56:47

标签: c# unity3d parse-platform

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

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

var queryCurrent = ParseObject.GetQuery("Levels")
.WhereEqualTo("ItemId", "Character")
.WhereEqualTo("Level", "3");

queryCurrent.FirstAsync().ContinueWith(t =>
{
    Character character = ScriptableObject.CreateInstance<Character>();
});

我收到以下错误;

  

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

这似乎是一个普遍问题,每个人都试图通过使用协同程序找到解决方法。优化的解决方案将不胜感激。

提前致谢。

1 个答案:

答案 0 :(得分:3)

使用Coroutine在主线程上运行。它在Parse网站上有记录:https://parse.com/docs/unity_guide#tasks-coroutines

编辑:

Unity为协同式多任务提供了Coroutine的概念,允许代码在主线程上运行时进行交错。任务和延续模型大多独立于这种多任务机制,但很容易适应协同程序中的工作。您的协程可以简单地检查任务的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;
}