解析主线程错误

时间:2015-10-07 19:09:39

标签: c# multithreading parse-platform unity3d

所以我有一个使用Parse的应用程序。我能够创建没有问题的新ParseObjects,以及查询已保存的ParseObjects。但是,每当我尝试更新我查询过的现有ParseObject时,都会收到以下错误:

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

现在我发现有些人会遇到类似的错误,“get_bundleIdentifier”就是区别,我认为这与不从“主线程”运行有关,但我不知道如何影响。我在协程中尝试了与建议here相同的代码,我得到了同样的错误。

我正在使用Parse版本1.6.0和Unity Pro 5.1.2。这是我的代码:

using UnityEngine;
using System.Collections;
using Parse;
using System.Threading.Tasks;
public class SimpleParseScript : MonoBehaviour {

    // Use this for initialization
    void Start () {
        var query = ParseObject.GetQuery("ChallengeScores") // query to parse to find scores and whos turn
            .WhereEqualTo("challengeID", 20307271925313064);
        query.FirstAsync().ContinueWith(t =>
                                        {
            ParseObject gameStatus = t.Result;
            print (gameStatus.ObjectId); // print queried ParseObject ObjectId - works fine
            gameStatus["turnsTaken"] = 100;
            Task saveTask = gameStatus.SaveAsync();
        });
    }
}

现在,如果我注释掉“gameStatus [”turnsTaken“] = 100;”,那么尝试保存它,它运行得很好,但是由于显而易见的原因没有保存。

任何人都有线索?解析文档right here表示它应该像在查询后声明并再次保存它一样简单,但不要去。

感谢您的时间和耐心。

1 个答案:

答案 0 :(得分:0)

所以我想出了一个解决方案;我认为你可以在查询中动态保存值,但我想将信息保存到变量应该发生在查询之外。

我现在的工作看起来像这样:

    using Parse;
    using System.Threading.Tasks;

    public class MainMenuScript : MonoBehaviour {

    ParseObject parseObjToUpdate; 
    private bool hasUpdatedParse;
    public string myCurrentChalID;

    void Start()
    {
        hasUpdatedParse = false;
        var query = ParseObject.GetQuery("ChallengeStatus")
            .WhereEqualTo("challengeID", myCurrentChalID);
            query.FirstAsync().ContinueWith(t =>
             {
                parseObjToUpdate = t.Result;
                print (parseObjToUpdate.ObjectId); // to debug that something is happening and it's the right object
              });
    }

    void Update ()
    {
       if (parseObjToUpdate != null && !hasUpdatedParse)
        {
            parseObjToUpdate["playerTurn"] = PlayerPrefs.GetString("opponentID");
            parseObjToUpdate.SaveAsync();
            hasUpdatedParse = true;
        }
    }

所以是的。将此标记为已解决。谢谢大家的关注,这很棒。