如何解决如何根据LiveData Map过滤LiveData列表?
我必须异步操作。在视图模型中,这两个需要为UI共同努力。如何根据de LiveData映射中的键过滤LiveData列表? (列表中的对象ID对应于地图键)
//save file
npp_saveall
//specify directory
//if blank set to src dir
inputbox "Specify Directory" : " save_directory" : $(CURRENT_DIRECTORY)
set DIR = $(INPUT)
if "$(INPUT)" == " " then
set DIR = $(CURRENT_DIRECTORY)
endif
if "$(INPUT)" == "" then
set DIR = $(CURRENT_DIRECTORY)
endif
//specify file name
//if blank set to a.exe
inputbox "Choose executable name" : " file_name" : a.exe
set NAME = $(INPUT)
if "$(INPUT)" == " " then
set NAME = a.exe
endif
if "$(INPUT)" == "" then
set NAME = a.exe
endif
//add compiling options
inputbox "Additional compiling options" : " add_options" : -m32 -I"C:\SDL2-2.0.12\i686-w64-mingw32 (x32)\include\SDL2" -L"C:\SDL2-2.0.12\i686-w64-mingw32 (x32)\lib"
set OPTIONS = $(INPUT)
//launch g++ compiler
g++.exe "$(FULL_CURRENT_PATH)" -o"$(DIR)\$(NAME)" $(OPTIONS)
//run compiled prgram
if $(EXITCODE) == 0 then
messagebox "Compilation successfull. Saved in '$(DIR)'. Running $(NAME)" : "MinGW g++ Compiler"
npp_run "$(DIR)\$(NAME)"
else
messagebox "Compilation not successfull."
解决方法
这样的事情怎么样(基于here中的MediatorLiveData示例)
val allJourneys: LiveData<List<Journey>> = journeysRepository.getAll()
val enrolledMap: LiveData<Map<String,String>> = progressRepository.getEnrolledJourneysMapOfUser()
private val _filteredJourneys = MediatorLiveData<List<Journey>>()
private val filteredJourneys: LiveData<List<Journey>> = _filteredJourneys
init {
_filteredJourneys.addSource(allJourneys) {
combineLatestData(allJourneys,enrolledMap)
}
_filteredJourneys.addSource(enrolledMap) {
combineLatestData(allJourneys,enrolledMap)
}
}
private fun combineLatestData(
journeysLD: LiveData<List<Journey>>,enrolledLD: LiveData<Map<String,String>>
): List<Journey>? {
val j = journeysLD.value
val e = enrolledLD.value
val result = listOf<Journey>()
if (j == null || e == null) {
return result // TODO filter j by e
}
return null
}
allJourney
和enrolledMap
LiveData中的更改应触发combineLatestData
observeForever
在ViewModel内部是错误的方法。每次调用get__
时,都会进行一个新的订阅,并且您将在ViewModel中获得多个订阅,并且可能发生内存泄漏,直到垃圾收集器清除卡住的订阅为止。
相反,在使用LiveData时,应该只使用返回值并将其保留为字段。
val allJourneys: LiveData<List<Journey>> get() = journeysRepository.getAll()
val enrolledMap: LiveData<Map<String,String>> get() = progressRepository.getEnrolledJourneysMapOfUser()
//fun getEnrolled() {
// viewModelScope.launch {
// .observeForever {
// Timber.d("Map values: $it")
// _enrolledMap.value = it
// }
// }
//
//}
//fun getJourneys() {
// viewModelScope.launch {
// .observeForever { it ->
// _allJourneys.value = it.filter {
// // enrolledMap.containsKey(it.id) ??? Nullpointer
// }
// }
// }
//}
由于来自DAO的存储库中的LiveData已经可以处理后台数据提取。
如果使用存储库中的挂起功能手动完成此操作,则可以使用switchMap
+ liveData { emitSource
-但在这种情况下,似乎没有必要。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。