Xamarin iOS:等待 HKHealthStore SaveObject 完成
Posted
技术标签:
【中文标题】Xamarin iOS:等待 HKHealthStore SaveObject 完成【英文标题】:Xamarin iOS: Wait for HKHealthStore SaveObject to finish 【发布时间】:2014-09-30 20:28:42 【问题描述】:我目前正在解决一个我无法单独解决的问题。我尝试将 HealthKit 集成到我的应用程序中。正常的解决方案效果很好,我目前正在处理错误以通知用户是否出现问题。问题是“SaveObject()”方法似乎是异步的,如果设置成功,则外部方法已经返回 false。我不知道如何解决这个问题。 :-(
下面是到目前为止我的代码的 sn-p。
private bool _saveToHealth(Data d)
HKHealthStore hkStore = new HKHealthStore ();
bool isSuccessful = false;
hkStore.SaveObject (d, (bool arg1, NSError arg2) =>
isSuccessful = arg1;
);
return isSuccessful;
【问题讨论】:
只是为了确定您遇到的问题:您调用_saveToHealth
并且一旦SaveObject()
完成保存状态(成功或失败),_saveToHealth
已经返回 false?
是的,这是真的。 isSuccessful 总是错误的。
【参考方案1】:
你不能真正写出这样的代码。您需要重组代码,以便在其他地方处理保存状态。
正如您所指出的,不能保证 isSuccessful = arg1 的委托会在您返回之前被执行。
现在,如果上述调用是从异步方法执行的,您可以调用该方法的异步版本:
async bool SaveToHealth (Data d)
var hkStore = new HKHealthStore ();
try
await hkStore.SaveObjectAsync (d);
return true;
catch
return false;
```
具有签名的方法的异步版本被映射为在失败时引发异常。
【讨论】:
非常适合我。方法签名必须是“async Task好吧,我不熟悉Xamarin ios
及其功能,但我在块的帮助下解决了Objective c
中类似的问题。我将在这里提供一个代码 sn-p 我将如何在 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
的 1 个实例,并且不要在每次调用此方法(或从 healthKit 保存或读取数据的任何方法)时实例化一个。
希望对你有帮助。
【讨论】:
以上是关于Xamarin iOS:等待 HKHealthStore SaveObject 完成的主要内容,如果未能解决你的问题,请参考以下文章