如何在用户注销时清除存储库缓存?
How to clear repository cache when the user logs out?
我有一个存储库,其中包含 StateFlow 中的内存缓存列表。问题是,每当用户注销并登录到另一个帐户时,前一个用户的旧数据仍然存在。
object Repository {
private lateinit var remoteDataSource: RemoteDataSource
operator fun invoke(remoteDataSource: remoteDataSource) {
this.remoteDataSource = remoteDataSource
return this
}
private val myList = MutableStateFlow(listOf<myData>())
suspend fun getData(): Flow<List<myData>> =
withContext(Dispatchers.IO) {
if (myList.value.isEmpty()) {
val response = remoteDataSource.getData()
if (response != null) {
myList.value = response.map { it.toMyData() }
}
}
myList
}
suspend fun addData(newData: MyData) =
withContext(Dispatchers.IO) {
myList.value = myList.value.plus(newData)
remoteDataSource.addData(myData.toMyDataRequest())
}
}
此存储库被多个 ViewModel 使用。列表本身只能被一个屏幕观察(我们称之为 myFragment),但其他屏幕可以向其添加新元素。我试图清除 myFragment 的 onDestroyView 上的存储库,但只要用户离开 myFragment(即使不是注销),它也会清除列表。
我们可以观察用户何时在 userRepository 中注销,但我不知道如何从另一个存储库观察一个存储库中的数据(没有像 viewModelScope.launch 那样收集流或类似的东西) .
有什么方法可以解决这个问题?它会如何清除列表?
i don't know how to observe data in one repository from another repository
我认为在这种情况下你不应该这么做。
您有一个use-case:注销。
当您调用此 use-case 时,您应该执行您的应用所需的所有必要操作。在这种情况下,您应该调用您的存储库让它知道。
suspend fun clearData() =
withContext(Dispatchers.IO) {
// clear your data
}
我认为您不应该对 Dispatcher 进行硬编码,因为您可能会在某个时候测试它;在你的测试中,你将使用 TestDispatcher 或类似的东西,如果你硬编码它,它将更难测试。你写测试,对吧?
现在你的用例..
class LogoutUseCase(repo: YourRepo) {
operator fun invoke() {
repo.clearData()
//do the logout
}
}
我就是这么想的。
所有这些的范围是启动注销的 UI...
我有一个存储库,其中包含 StateFlow 中的内存缓存列表。问题是,每当用户注销并登录到另一个帐户时,前一个用户的旧数据仍然存在。
object Repository {
private lateinit var remoteDataSource: RemoteDataSource
operator fun invoke(remoteDataSource: remoteDataSource) {
this.remoteDataSource = remoteDataSource
return this
}
private val myList = MutableStateFlow(listOf<myData>())
suspend fun getData(): Flow<List<myData>> =
withContext(Dispatchers.IO) {
if (myList.value.isEmpty()) {
val response = remoteDataSource.getData()
if (response != null) {
myList.value = response.map { it.toMyData() }
}
}
myList
}
suspend fun addData(newData: MyData) =
withContext(Dispatchers.IO) {
myList.value = myList.value.plus(newData)
remoteDataSource.addData(myData.toMyDataRequest())
}
}
此存储库被多个 ViewModel 使用。列表本身只能被一个屏幕观察(我们称之为 myFragment),但其他屏幕可以向其添加新元素。我试图清除 myFragment 的 onDestroyView 上的存储库,但只要用户离开 myFragment(即使不是注销),它也会清除列表。
我们可以观察用户何时在 userRepository 中注销,但我不知道如何从另一个存储库观察一个存储库中的数据(没有像 viewModelScope.launch 那样收集流或类似的东西) .
有什么方法可以解决这个问题?它会如何清除列表?
i don't know how to observe data in one repository from another repository
我认为在这种情况下你不应该这么做。
您有一个use-case:注销。
当您调用此 use-case 时,您应该执行您的应用所需的所有必要操作。在这种情况下,您应该调用您的存储库让它知道。
suspend fun clearData() =
withContext(Dispatchers.IO) {
// clear your data
}
我认为您不应该对 Dispatcher 进行硬编码,因为您可能会在某个时候测试它;在你的测试中,你将使用 TestDispatcher 或类似的东西,如果你硬编码它,它将更难测试。你写测试,对吧?
现在你的用例..
class LogoutUseCase(repo: YourRepo) {
operator fun invoke() {
repo.clearData()
//do the logout
}
}
我就是这么想的。 所有这些的范围是启动注销的 UI...