Статус | Ожидание | Реальность |
---|---|---|
✅ | Suspend-функции развернулись в удобную для Swift-конструкцию | Транслируется в callback, экспериментально - в async / await. Но для использования в реактивных фреймворках требуются дополнительный bridge-код |
Опишем класс, использующий suspend-функции Kotlin-а:
data class Thing(val item: Int)
class ThingRepository {
suspend fun getThing(succeed: Boolean): Thing {
delay(100)
if (succeed) {
return Thing(0)
} else {
error("oh no!")
}
}
}
На стороне Swift-а suspend-функция превращается в completion handler.
// suspend function
ThingRepository().getThing(succeed: true, completionHandler: { thing, error in
// do something
})
С Kotlin 1.5.30 появилась экспериментальная возможность мапить suspend-функции в вид async/await. Но, вероятно, iOS-команда не будет использовать эту фичу в ближайшее время, потому что она будет нормально доступна только с iOS 15.
Про маппинг suspend-функций для реактивных фреймворков можно почитать серию статей:
- Статья: Использование suspend в Swift - про неудобство с RxSwift
- Статья: Использование suspend в Swift в 2021 году
- Github: Пример работы корутин с RxSwift / Combine на основе статей от Touchlab