首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS:等待HKHealthStore SaveObject完成

iOS:等待HKHealthStore SaveObject完成
EN

Stack Overflow用户
提问于 2014-09-30 20:28:42
回答 2查看 216关注 0票数 0

我目前正在研究一个我无法独自解决的问题。我试图将HealthKit集成到我的应用程序中。正常的解决方案工作得很好,我目前正在进行错误处理,以便在出现错误时通知用户。问题是方法"SaveObject()“似乎是异步的,如果设置成功,外部方法已经返回false。我不知道如何解决这个问题。:-(

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

代码语言:javascript
复制
private bool _saveToHealth(Data d)
{
    HKHealthStore hkStore = new HKHealthStore ();
    bool isSuccessful = false;
    hkStore.SaveObject (d, (bool arg1, NSError arg2) => {
            isSuccessful = arg1;
    });
    return isSuccessful;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-02 02:30:57

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

正如您所指出的,不能保证在您到达返回之前将执行带有isSuccessful = arg1的委托。

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

代码语言:javascript
复制
async bool SaveToHealth (Data d)
{
     var hkStore = new HKHealthStore ();
     try {
          await hkStore.SaveObjectAsync (d);
          return true;
     } catch {
          return false;
     }
}
代码语言:javascript
复制

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

票数 2
EN

Stack Overflow用户

发布于 2014-10-02 08:36:39

嗯,我不熟悉Xamarin iOs及其功能,但是我在块的帮助下解决了一个类似于Objective c中的问题。我将在这里提供一个代码片段,说明如何在Objective c中这样做,并希望您能够对编程语言进行必要的调整:

代码语言:javascript
复制
- (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中保存或读取数据的方法)时实例化一个实例。

希望它能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26129514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档