Xamarin.iOS Почему HKAnchoredObjectQuery неактивен, а затем деактивируется при отладке на устройстве? - PullRequest
0 голосов
/ 13 декабря 2018

Я в тупике.У меня есть код, который отлично работает на симуляторе iOS, но когда я отлаживаю на реальном устройстве, объект HKAnchoredObjectQuery неактивен до его запуска: <HKAnchoredObjectQuery:0x2816e8780 inactive>

И затем деактивируется после выполнения в обработчике результатов: <HKAnchoredObjectQuery:0x2816e8780 deactivated>

Мой код выглядит следующим образом:

var query = new HKAnchoredObjectQuery(type, compoundPredicate, lastAnchor, nuint.MaxValue, new HKAnchoredObjectResultHandler2(
(q, results, anchor, error) =>
{
    if (error != null)
    {
        _logger.Error("GetCountSinceLastAnchor: {description}", error.DebugDescription);
    }

    var totalCountInThisAnchor = results.Cast<HKQuantitySample>().Sum(sample => sample.Quantity.GetDoubleValue(unit));
    _logger.Information("GetCountSinceLastAnchor: type:{type}, count: {count}, lastAnchor:{lastAnchor}, New Anchor:{anchor}", type.DebugDescription, totalCountInThisAnchor, lastAnchor, anchor);
    taskCompletionSource.SetResult(Tuple.Create(totalCountInThisAnchor, anchor));
}));
_healthKitStore.ExecuteQuery(query);

Итак, точка останова на ExecuteQuery дает мне «неактивный» тег для объекта query, а точка останова на if (error != null) даетменя "деактивировали" на q.

У кого-нибудь есть идеи, почему это происходит?Как я уже говорил, все это прекрасно работает на симуляторе iOS.

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

1 Ответ

0 голосов
/ 13 декабря 2018

Хорошо.Так что я думаю, что это сработало, как и ожидалось.Я предполагаю, что, поскольку мой запрос является запросом, который выполняется один раз без долго работающего обработчика, запрос неактивен до его выполнения и деактивируется в обработчике, потому что он не будет выполняться снова.

Причина, по которой я не получил результатовпотому что у меня был этот предикат, включающий только устройства Apple: HKQuery.GetPredicateForMetadataKey(HKMetadataKey.DeviceManufacturerName, NSPredicateOperatorType.EqualTo, NSObject.FromObject("Apple"));

Использование метаключа DeviceManufacturerName устарело.

Правильный способ сделать это: HKQuery.GetPredicateForObjectsWithDeviceProperty(HKDevicePropertyKey.Manufacturer, new NSSet<NSString>((NSString) "Apple"));

Было бы неплохо, если бы Хамарин отметил это перечисление как устаревшее.И / или было какое-то предупреждение при использовании его в симуляторе, потому что там он работал нормально.

Надеюсь, это сэкономит некоторое время в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...