Сегодня расскажу вам интересную историю, которая произошла при рефакторинге одного из проектов. В коде одного из интеракторов начал падать SQL-запрос SQLiteException: too many SQL variables.
Долго искали ошибку, и подозрение упало на недавно переписанную логику с RxJava на Kotlin Flow. Сравните 2 цепочки:
Цепочка на Kotlin Flow
var ids = listOf(1,2,3,4,5,6,7,8,9,10)
flowOf(ids)
.buffer(BUFFER_SIZE)
Цепочка на RxJava
var ids = listOf(1,2,3,4,5,6,7,8,9,10)
Observable.fromIterable(ids)
.buffer(BUFFER_SIZE)
Может показаться, что они выглядят одинаково, однако это заблуждение. Более подробно о том, как работает оператор buffer() в Kotlin Flow с диаграммами и код-сниппетами я рассказал в посте , ну а для самых нетерпеливых, проблема была в операторе buffer(). Оператор buffer() в Kotlin Flow позволяет нам запускать коллектор на другой корутине. И это позволяет нам выполнять параллельно работу коллектора и эмиттера. В отличие от оператора Observable.buffer(), marble-диаграмма которого показана в посте.