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 SaveToHealth (Data d) 并且调用方法必须像这样定义:Task noErrorTask = SaveToHealth(item); noError = noErrorTask.Result;【参考方案2】:

好吧,我不熟悉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 完成的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient不适用于使用Xamarin在VS中构建的IO应用程序

Xamarin iOS:替换当前标签栏项目中的视图控制器

使用异步等待 C# Xamarin

在 c# Xamarin 中等待带有弹出窗口的任务

Xamarin 跳过一个等待的方法

Xamarin 表单 sqlite Async await 不等待进程