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;
}
你真的不能写这样的代码。您需要重新构造代码,以便在其他地方处理保存状态。
正如您所指出的,无法保证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保存或读取数据的任何方法)时都实例化一个。
希望它能帮助你。