我目前正在研究一个我无法独自解决的问题。我试图将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;
}发布于 2014-10-02 02:30:57
你不能真的写这样的代码。您需要重构代码,以便在其他地方处理保存状态。
正如您所指出的,不能保证在您到达返回之前将执行带有isSuccessful = arg1的委托。
现在,如果上面的调用是从异步方法执行的,则可以调用该方法的异步版本:
async bool SaveToHealth (Data d)
{
var hkStore = new HKHealthStore ();
try {
await hkStore.SaveObjectAsync (d);
return true;
} catch {
return false;
}
}具有签名的方法的异步版本映射为在失败时抛出异常。
发布于 2014-10-02 08:36:39
嗯,我不熟悉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中保存或读取数据的方法)时实例化一个实例。
希望它能帮到你。
https://stackoverflow.com/questions/26129514
复制相似问题