Асинхронный режим URLSession не работает в Swift Package
Я пытаюсь выполнить асинхронный сетевой вызов, используя async / await в Swift 5.5, но по какой-то причине он не работает должным образом в моем Swift Package.
let (data, response) = URLSession.shared.data(for: request)
Приведенная выше строка кода работает на быстрой игровой площадке (запрос здесь является URLRequest), но она не работает внутри моего пакета Swift (с использованием быстрых инструментов версии 5.5)
Сначала ошибка:
Type of expression is ambiguous without more context
но я понял, что это связано с присвоением кортежа, поэтому я изменил оператор на просто:
let data = URLSession.shared.data(for: request)
И это дает мне ошибку:
Value of type 'URLSession' has no member 'data'
Более того, автозавершение кода Xcode не перечисляет .data (for:) при работе в Swift Package, в отличие от игровой площадки. Для лучшего понимания посмотрите скриншоты ниже.
2 ответа
Я провел достаточно исследований и пришел к выводу, что пакет Swift (который создается повсеместно) требует SDK macOS 12.0 для Swift Concurrency, а в текущем выпуске Xcode 13 его нет. Это только в бета-версиях, поэтому мне придется использовать последнюю бета-версию или дождаться, пока Apple объявит о выпуске Xcode, который поддерживает MacOS 12 SDK.
Я удивлен, что вы не заметили ошибку
expression is 'async' but is not marked with 'await'
Вызов функции
URLSession.shared.data(for: request)
, потому что это
async
, должен возвращать асинхронное продолжение вместо
(Data,URLResponse)
кортеж.
У вас будет два способа справиться с этим. Вы могли сразу
await
ответ, предложенный в комментариях:
let (data, response) = await URLSession.shared.data(for: request)
или вы могли бы использовать
async let
чтобы захватить продолжение, а затем вы можете дождаться его позже:
async let requestTask = URLSession.shared.data(for: request)
print("Doing some other stuff")
let (data, response) = try await requestTask