在 c# 中的 Parse 中访问指针向下两个级别
Access to pointers two levels down in Parse in c#
我已将数据存储在 Parse 中,现在我必须访问它才能为玩游戏的用户创建前十名分数,从而允许用户仅显示在列表中。
数据的存储方式是每个游戏都有一个 运行 有一个会话,其中有一个用户的姓名、通行证等
如此 运行 会话 => 用户(姓名、通行证、电子邮件等)。
我需要访问用户的姓名,以检查该用户是否已出现在前十名中并显示该姓名。
虽然我可以访问 Session 上的数据,但我无法访问 User 上的数据。
int counter = 0;
ParseQuery<ParseObject> query = ParseObject.GetQuery("Runs").WhereEqualTo("scoreIdentifier", GameController.instance.scoreContext).OrderByDescending("score");
query.Include("session.user");
query.FindAsync().ContinueWith(t => {
IEnumerable<ParseObject> results = t.Result;
foreach (var item in results) {
if (item.ContainsKey("score")) {
if (counter < 10) {
topTenScores[counter] = item.Get<int>("score");
topTenNames[counter] = item.ObjectId;
ParseObject session = item.Get<ParseObject>("session");
Task<ParseObject> user = session.FetchAsync<ParseObject>();
user.ContinueWith(tt => {
ParseObject userName = tt.Result;
Debug.Log("CHECK FOR TT " + tt.Result.ObjectId);
});
}
if (counter == 9) {
updateTopTen = true;
}
counter++;
}
if (counter < 10)
updateTopTen = true;
}
});
tt.Result.ObjectId 为 Session 写出 objectId,而我认为它是为 User 写的。
关于我做错了什么有什么建议吗?
我自己想出来了——fetchAync() 需要更多的迭代:
public void TopTenHighScore() {
int sessionCounter = 0;
ParseQuery<ParseObject> query = ParseObject.GetQuery("Runs").WhereEqualTo("scoreIdentifier", GameController.instance.scoreContext).OrderByDescending("score");
query.Include("session.user");
query.FindAsync().ContinueWith(t => {
IEnumerable<ParseObject> results = t.Result;
foreach (var item in results) {
if (item.ContainsKey("score")) {
if (sessionCounter < 10) {
// --- this is for the overall Score
topTenScores[sessionCounter] = item.Get<int>("score");
ParseObject sessionPointer = item.Get<ParseObject>("session");
Task<ParseObject> session = sessionPointer.FetchAsync<ParseObject>();
session.ContinueWith(tt => {
ParseObject userPointer = tt.Result;
Task<ParseObject> user = userPointer.Get<ParseObject>("user").FetchAsync<ParseObject>();
user.ContinueWith(ttt => {
ParseObject userFinal = ttt.Result;
userNamesList.Add(userFinal.Get<string>("displayName"));
});
});
}
if (sessionCounter == 9) {
sessionCounterDone = true;
}
sessionCounter++;
}
// if the amount of sessions played in total is not above 10
if (sessionCounter < 10)
sessionCounterDone = true;
}
});
}
我已将数据存储在 Parse 中,现在我必须访问它才能为玩游戏的用户创建前十名分数,从而允许用户仅显示在列表中。 数据的存储方式是每个游戏都有一个 运行 有一个会话,其中有一个用户的姓名、通行证等
如此 运行 会话 => 用户(姓名、通行证、电子邮件等)。
我需要访问用户的姓名,以检查该用户是否已出现在前十名中并显示该姓名。
虽然我可以访问 Session 上的数据,但我无法访问 User 上的数据。
int counter = 0;
ParseQuery<ParseObject> query = ParseObject.GetQuery("Runs").WhereEqualTo("scoreIdentifier", GameController.instance.scoreContext).OrderByDescending("score");
query.Include("session.user");
query.FindAsync().ContinueWith(t => {
IEnumerable<ParseObject> results = t.Result;
foreach (var item in results) {
if (item.ContainsKey("score")) {
if (counter < 10) {
topTenScores[counter] = item.Get<int>("score");
topTenNames[counter] = item.ObjectId;
ParseObject session = item.Get<ParseObject>("session");
Task<ParseObject> user = session.FetchAsync<ParseObject>();
user.ContinueWith(tt => {
ParseObject userName = tt.Result;
Debug.Log("CHECK FOR TT " + tt.Result.ObjectId);
});
}
if (counter == 9) {
updateTopTen = true;
}
counter++;
}
if (counter < 10)
updateTopTen = true;
}
});
tt.Result.ObjectId 为 Session 写出 objectId,而我认为它是为 User 写的。
关于我做错了什么有什么建议吗?
我自己想出来了——fetchAync() 需要更多的迭代:
public void TopTenHighScore() {
int sessionCounter = 0;
ParseQuery<ParseObject> query = ParseObject.GetQuery("Runs").WhereEqualTo("scoreIdentifier", GameController.instance.scoreContext).OrderByDescending("score");
query.Include("session.user");
query.FindAsync().ContinueWith(t => {
IEnumerable<ParseObject> results = t.Result;
foreach (var item in results) {
if (item.ContainsKey("score")) {
if (sessionCounter < 10) {
// --- this is for the overall Score
topTenScores[sessionCounter] = item.Get<int>("score");
ParseObject sessionPointer = item.Get<ParseObject>("session");
Task<ParseObject> session = sessionPointer.FetchAsync<ParseObject>();
session.ContinueWith(tt => {
ParseObject userPointer = tt.Result;
Task<ParseObject> user = userPointer.Get<ParseObject>("user").FetchAsync<ParseObject>();
user.ContinueWith(ttt => {
ParseObject userFinal = ttt.Result;
userNamesList.Add(userFinal.Get<string>("displayName"));
});
});
}
if (sessionCounter == 9) {
sessionCounterDone = true;
}
sessionCounter++;
}
// if the amount of sessions played in total is not above 10
if (sessionCounter < 10)
sessionCounterDone = true;
}
});
}