firebase - 在 Android 的 Firebase 存储中按创建时间对项目进行排序
问题描述
我需要按创建时间对 firebase 文件夹中的项目进行排序。创建时间在项目的元数据中。
我已经能够做到这一点,但我觉得使用监听器和“任务”实用程序类有更好的方法来完成它。
我尝试遵循本指南,但我的用例更复杂
getMedatada 文档:https://firebase.google.com/docs/reference/android/com/google/firebase/storage/StorageReference#getMetadata()
getCreationTimeMillis 文档:https://firebase.google.com/docs/reference/android/com/google/firebase/storage/StorageMetadata#getCreationTimeMillis()
这是我的代码:
FirebaseStorage.getInstance().reference.child(category).listAll().addOnSuccessListener {
val listOfTalks = mutableListOf<Task<StorageMetadata>>()
val items = it.items
items.forEach { listOfTalks.add(it.metadata) } // collecting the list of task for getting the metadata
val metadataTasks = Tasks.whenAllComplete(listOfTalks)
// wait fore all the metadata
metadataTasks.addOnSuccessListener {
// put them in a helper class and sort
val sortedBy = it.map {
val storageMetadata = it.result as StorageMetadata
ReferenceAndTimeForSorting(
storageMetadata.reference!!,
storageMetadata.creationTimeMillis
)
}.sortedByDescending { it.timestamp }
// keep al the references int the result
storageReferenceList.addAll(sortedBy.map { it.reference })
}
metadataTasks.addOnFailureListener {
// if there is an error getting the metadata, keep the default sorting
storageReferenceList.addAll(items)
}
}
解决方案
这就是我们最终的结果:
FirebaseStorage.getInstance()
.reference
.child(category)
.listAll()
.addOnSuccessListener { listAllResult ->
val metadataTaskList = listAllResult.items.map { it.metadata }
Tasks.whenAllComplete(metadataTaskList)
.addOnSuccessListener { taskList ->
val storageReferenceList = taskList
.map { it.result as StorageMetadata }
.sortedByDescending { it.creationTimeMillis }
.mapNotNull { it.reference }
updateGallery(storageReferenceList)
}
.addOnFailureListener {
updateGallery(listAllResult.items)
}
}