Return 来自解析对象查询回调的对象数据

Return object data from parse object query callback

我对 Java/android 编程还很陌生,我被困在 Parse.com 回调中。

有一个方法 (method1) 请求当前用户拥有的对象的 objectId。它通过调用另一个方法 (method2) 来实现这一点,该方法包含一个查询,该查询使用回调从数据浏览器中拉出一个对象。

我设法编写了所有代码,但我卡在方法 2 的回调中。我希望将对象数据 returned 到方法 1,但这似乎是不可能的,因为回调类型(空白)。

我现在也知道如何让方法的其余部分在执行之前等待回调到 return。如果有人能帮助我,我将不胜感激。

这是我的代码:

public void method1(){
    String objectId = null;

    objectId = QueryStatisticObjectId("Age");

    Log.i(TAG, "objectId returned to method = " + objectId);
}



    public String QueryStatisticObjectId(final String statistic){
        ParseQuery<ParseObject> query = ParseQuery.getQuery("Statistics");
        query.whereEqualTo("user", ParseUser.getCurrentUser());
        query.whereEqualTo("statistic", statistic);
        query.getFirstInBackground(new GetCallback<ParseObject>() {
            @Override
            public void done(ParseObject object, ParseException e) {
                if (e == null){
                    //We have data!
                    String objectId = object.getObjectId();
                    return;
                }
                else
                {
                    //Something went wrong!?!
                    e.printStackTrace();
                }
            }
        });

因此,在 iOS 或 Android 中使用 Parse 无法实现您尝试执行的操作。我认为它可能会按照您希望的方式在 .NET 上运行(使用 Await 关键字)。

相反,问问自己:

  1. 为什么要以这种方式构建您的 class?
  2. 为什么 return 值对原始方法很重要?
  3. 仅仅是因为你想要一种可回收的方法吗?
  4. 是否因为您想在更有意义的方法上下文中处理值?

如果是这样,请尝试这样的操作:

public void method1() {
    QueryStatisticObjectId("Age", new GetCallback<ParseObject>() {
        @Override
        public void done(ParseObject object, ParseException e) {
            if (e == null) {
                String objectId = object.getObjectId();
                Log.i(TAG, "objectId returned to method = " + objectId);
            } else {
                Log.i(TAG, "objectId not found");
            }               
        }
    });
}

public void QueryStatisticObjectId(final String statistic, GetCallback<ParseObject> callback) {
    ParseQuery<ParseObject> query = ParseQuery.getQuery("Statistics");
    query.whereEqualTo("user", ParseUser.getCurrentUser());
    query.whereEqualTo("statistic", statistic);
    query.getFirstInBackground(callback);
}

通过这种方式,您可以编写代码在有意义的上下文 (method1()) 中处理 returned 结果,同时还可以尽可能多地重复使用查询方法像。此外,与@JimW 的回答相反,它不使用同步网络调用,这也让您有机会保持应用程序的 UI 响应。

我遇到了同样的问题,回调真的很烦人,好像它们是随机触发的,而且 return 类型的 void 使得 Overriding everything neccessary。我通过使用不带回调的常规 .find() 解决了您的问题。然后我使用自定义代码完成了所有繁重的工作。