Решение ивентов с enum, на мой взгляд, не самое эффективное. Лучше использовать sealed class
sealed class Event<T : Any> {
var isHandled: Booleand = false
data class Success<T>(val data: T) : Event<T>()
data class Error(val message: String, val error: Throwable?) : Event<Nothing>()
object Loading : Event<Nothing>()
}
это дает некую мутабельность ивентов при пересечении архитектурных слоев если использовать Clean Architecture. Например, DataLayer может работать только с
Event<DatabaseEntity>
, а PresentationLayer может принимать только
Event<DataUIModel>
, тогда мы можем более лучше разграничить какие объекты могут пересекать архитектурные слои.
Конвертер в данном случае будет простой функцией
inline fun <reified T : Any, reified R : Any> Event<T>.mutateTo(): Event<R> {
// ваша логика конвертации
}
“If you think that good architecture is expensive, try bad architecture.”
— Brian Foote and Joseph Yoder
1) События обрабатываются синхронно, но так как внутри kotlin object то это потоко безопасный объект.
2) Обрабатывается сразу же
3) Тут все зависит указали ли вы приоритет вызова коллбэка для подписывамого события. если приоритет не указан то вызовется сначала первая функция слушателя а затем вторая которая находиться внутри первого.
4) Не будет, вы же отписываете слушатель. (опять же вопрос приоритета, если у последней приортиет вызова больше то естественно она вызовется первой)
5) Никак, он запишет только первый вызов, второй проигнорирует
6) К сожалению в настоящий момент я исключения не обрабатываются, спасибо за пояснение. Цепочка прервется.
7) Да можно
это дает некую мутабельность ивентов при пересечении архитектурных слоев если использовать Clean Architecture. Например, DataLayer может работать только с , а PresentationLayer может принимать только , тогда мы можем более лучше разграничить какие объекты могут пересекать архитектурные слои.
Конвертер в данном случае будет простой функцией
2) Обрабатывается сразу же
3) Тут все зависит указали ли вы приоритет вызова коллбэка для подписывамого события. если приоритет не указан то вызовется сначала первая функция слушателя а затем вторая которая находиться внутри первого.
4) Не будет, вы же отписываете слушатель. (опять же вопрос приоритета, если у последней приортиет вызова больше то естественно она вызовется первой)
5) Никак, он запишет только первый вызов, второй проигнорирует
6) К сожалению в настоящий момент я исключения не обрабатываются, спасибо за пояснение. Цепочка прервется.
7) Да можно