URLSessionWebSocketTask.receive() не вызывает отмену()

Я неоднократно звоню URLSessionWebSocketTask.receive. Я пробовал рекурсивно вызывать версию с обработчиком завершения , а также зацикливаться на новой асинхронной версии .

В какой-то момент я больше не получаю сообщений и хочу отменить веб-сокет. Поэтому я звоню URLSessionWebSocketTask.cancel(). В логе вижу сообщение [websocket] Read completed with an error Operation canceled. Но обработчик завершения никогда не вызывается/метод асинхронного получения никогда не возвращается. Это означает, что TaskЯ начал делать прием никогда не закрывается.

Почему обработчик завершения не вызывается при отмене веб-сокета?

1 ответ

Вы действительно видите утечку с подходом, основанным на замыкании?

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

Если я использую делегата в сеансе, я получу обратный вызов, когда веб-сокет будет закрыт, но я должен позвонитьпри уборке.

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

Другие вопросы по тегам