Siri Intenthandler не освобождается в основном потоке - PullRequest
0 голосов
/ 24 января 2019

Я хочу использовать CLLocationManager с обратными вызовами в моем намерении Siri. Чтобы получить обратные вызовы, я должен создать его в главном потоке (в противном случае я получаю предупреждение о том, что «сам поток должен иметь активный цикл выполнения»

Итак, я делаю это в главном потоке, и все работает нормально, если задание выполнено и пользователю отображается представление ответа.

Однако я заметил, что мой класс Intenthandling не освобождается после того, как я вызываю обработчик завершения. Не имеет значения, если я только вызову завершение сразу, метод dealloc не вызывается.

Я подозреваю, что это потому, что я вызываю обработчик завершения из основного потока? Раздетый метод:

- (void)handleCheckout:(nonnull CheckoutIntent *)intent completion:(nonnull void (^)(CheckoutIntentResponse * _Nonnull))completion {
    dispatch_async(dispatch_get_main_queue(), ^{
        CheckoutIntentResponse *ir = [[CheckoutIntentResponse alloc] initWithCode:CheckoutIntentResponseCodeSuccess userActivity:nil];
        completion(ir); //object won't be deallocated   
    });
}

Если бы было замечательно, если бы кто-то более знающий мог рассказать о:

  1. это проблема? Я вижу, что через некоторое время весь процесс завершается.

  2. Есть ли что-то еще, что я могу сделать? Я попытался вызвать обработчик завершения из вызывающего потока, а затем запустить основной поток. Работа выполнена, но тогда Сири, конечно, не будет ждать, но сразу напечатает ответ пользователя, что не очень хорошо работает.

...