2014-09-30 2 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

+0

Да, это правда. isSuccessful ВСЕГДА ложь. – Freddy

ответ

2

Вы не можете писать код, как это. Вы должны перестроить свой код, чтобы вы обрабатывать сохранить состояние где-то в другом месте.

Как вы отметили, нет никакой гарантии, что делегат с isSuccessful = arg1 никогда не будет выполнен, прежде чем достичь возвращения.

Теперь, если выше вызова выполняются из метода асинхронного, вы можете вызовите версию Async этого метода:

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

`` `

версия асинхронных методов, которые имеют подпись отображаются бросать исключения в случае неудачи.

+0

Прекрасно подходит для меня. Подпись метода должна быть «async Task SaveToHealth (данные d), а метод вызова должен быть определен следующим образом: Задача noErrorTask = SaveToHealth (item); noError = noErrorTask.Result; – Freddy

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).

Надеюсь, это поможет вам.

Смежные вопросы