Xamarin iOS:等待HKHealthStore SaveObject完成

本文关键字:SaveObject 完成 HKHealthStore 等待 iOS Xamarin | 更新日期: 2023-09-27 18:25:18

我目前正在处理一个无法单独解决的问题。我尝试在我的应用程序中集成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;
}

Xamarin iOS:等待HKHealthStore SaveObject完成

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

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

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

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

```

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

嗯,我不熟悉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保存或读取数据的任何方法)时都实例化一个。

希望它能帮助你。