0

我目前正在解决一个我无法单独解决的问题。我尝试将 HealthKit 集成到我的应用程序中。正常的解决方案效果很好,我目前正在处理错误以通知用户是否出现问题。问题是“SaveObject()”方法似乎是异步的,如果设置成功,则外部方法已经返回 false。我不知道如何解决这个问题。:-(

以下是我到目前为止的代码片段。

private bool _saveToHealth(Data d)
{
    HKHealthStore hkStore = new HKHealthStore ();
    bool isSuccessful = false;
    hkStore.SaveObject (d, (bool arg1, NSError arg2) => {
            isSuccessful = arg1;
    });
    return isSuccessful;
}
4

2 回答 2

2

你不能真正写出这样的代码。您需要重组代码,以便在其他地方处理保存状态。

正如您所指出的,不能保证 isSuccessful = arg1 的委托会在您返回之前被执行。

现在,如果上述调用是从异步方法执行的,您可以调用该方法的异步版本:

async bool SaveToHealth (Data d)
{
     var hkStore = new HKHealthStore ();
     try {
          await hkStore.SaveObjectAsync (d);
          return true;
     } catch {
          return false;
     }
}

```

具有签名的方法的异步版本被映射为在失败时引发异常。

于 2014-10-02T02:30:57.823 回答
0

好吧,我不熟悉Xamarin iOs, 及其功能,但我在Objective c块的帮助下解决了与此类似的问题。我将在此处提供一个代码片段,说明我将如何做到这一点Objective c,希望您可以对您的编程语言进行所需的调整:

- (void)saveToHealthData:(Data *)d WithCompletionHandler:( void ( ^ )(BOOL isSuccessful) )completionHandler
{
    HKHealthStore *hkStore = [HKHealthStore new];  
    BOOL isSuccessful = NO;
    [hkStore saveObject:d withCompletion:^(BOOL success, NSError *error) {
         completionHandler(success);
    }];
}

在任何情况下,您都应该考虑在HKHealthStore每次调用此方法(或从 healthKit 保存或读取数据的任何方法)时只使用 1 个实例,而不是实例化一个。

希望它会帮助你。

于 2014-10-02T08:36:39.673 回答