[Android/Kotlin] Transformations.map() vs switchMap()
1.戻りタイプ
Live Data Source,Function
val userLiveData : LiveData<User> = MutableLiveData(User("Jone", "Doe"))
val userName : LiveData<String> = Transformations.map(userLiveData) { user ->
user.firstName + user.lastName
}
LiveData Switch Map(LiveData trigger、機能
val userLiveData : LiveData<User> = MutableLiveData(User("Jone", "Doe"))
val userName : LiveData<String> = Transformations.switchMap(userLiveData) { user ->
MutableLiveData(user.firstName + user.lastName)
}
2.静的変換VS動的変換
map():静的変換
データが変化したときにすぐに変換する必要がある場合は、map()を使用して、次のコードに示すことができます.LiveDataとしてのソースが変更されると、データが変換され、イベントがViewModelResult(LiveData)を受信するObserverに送信されます.
class MainViewModel {
val viewModelResult = Transformations.map(repository.getDataForUser() { data ->
convertDataToMainUIModel(data)
}
}
スイッチャMap()スイッチャMap():動的変換どうてきへんかんデータ変換はすぐに完了するのは難しいため、初期化フェーズでは使用できませんが、将来使用できる場合はスイッチマッピング()を使用できます.
switch Map()はLiveDataオブジェクトを返すため、リポジトリに格納されます.getDataForUser(ユーザ)は将来使用するLiveDataを返し,準備完了時にリポジトリを格納する.getDataForUser(ユーザ)では、変換されたデータを以前に戻ったLiveDataに更新できます.
class MainViewModel {
val repositoryResult = Transformations.switchMap(userManager.user) { user ->
repository.getDataForUser(user)
}
}
3.簡単な仕事と時間のかかる仕事
メインスレッドでmap()とswitchmap()が実行されると、操作時間が長すぎるとUIが一時停止したり、ANRが表示されたりすることがあります.
switch Map()は、LiveDataオブジェクトに戻り、別のスレッドで長時間の操作を行い、完了後にLiveDataに更新することを実現します.switch Map()を呼び出すスレッドはLiveDataオブジェクトを直接受信するため、スレッドをブロックしません.ただし、LiveDataのデータを更新するには、別のスレッドで処理を完了する必要があります.
ソース
https://codechacha.com/ko/android-jetpack-difference-map-and-switchmap/
Reference
この問題について([Android/Kotlin] Transformations.map() vs switchMap()), 我々は、より多くの情報をここで見つけました https://velog.io/@hyom/AndroidKotlin-Transformations.map-vs-switchMapテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol