2014-09-30 72 views
0

我目前正在解决一个我无法单独解决的问题。我尝试将HealthKit集成到我的应用程序中。正常的解决方案工作完美,我目前正在处理错误,以通知用户是否出现问题。问题是,方法“SaveObject()”似乎是异步的,如果成功设置,外部方法已经返回false。我不知道如何解决这个问题。 :-(Xamarin iOS:等待HKHealthStore SaveObject完成

下面是我的代码片段至今。

private bool _saveToHealth(Data d) 
{ 
    HKHealthStore hkStore = new HKHealthStore(); 
    bool isSuccessful = false; 
    hkStore.SaveObject (d, (bool arg1, NSError arg2) => { 
      isSuccessful = arg1; 
    }); 
    return isSuccessful; 
} 
+0

只是为了确定您遇到的问题:您调用'_saveToHealth'并且一旦'SaveObject()'以保存状态结束(成功或失败),'_saveToHealth'已经返回false? – goldengil 2014-10-01 12:33:13

+0

是的,这是真的。成功永远是假的。 – Freddy 2014-10-01 14:16:25

回答

2

你真的不能这样写代码,你需要让你处理保存状态别处去调整你的代码。

正如您所指出的,也不能保证你到达返回之前与isSuccessful = ARG1委托永远不会被执行。现在

,如果上述呼叫正从异步方法执行,你可以调用该方法的异步版本:

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

```

的有签名被映射到失败抛出异常方法的异步版本。

+0

适合我。方法签名必须是“异步任务 SaveToHealth(数据d),调用方法必须如下定义:任务 noErrorTask = SaveToHealth(item); noError = noErrorTask.Result; – Freddy 2014-10-05 18:00:03

0

嗯,我不熟悉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); 
    }]; 
} 

在任何情况下,你应该考虑的只有1个例HKHealthStore,并且每次调用此方法时(或者从healthKit保存或读取数据的任何方法),不会实例化一个。

希望它能帮助你。