gpt4 book ai didi

android - 摆脱嵌套的任务类型

转载 作者:行者123 更新时间:2023-11-29 18:36:46 24 4
gpt4 key购买 nike

是否有可能摆脱嵌套的 Task 泛型?

对于每个 continueWith声明,一个新的 Task在类型中添加。每个延续都是类型的一部分。理想情况下,我会返回一个任务,它连续执行每一个任务,并作为一个任务成功或失败。

例子

第一个操作查询用户的组

private fun getGroupsSnapshot(): Task<QuerySnapshot> {
val userId = Auth.currentUser()!!.uid
val query = userGroupsQuery(groupsCollection, userId)
return query.get()
}

第二个操作查询这些组中的相册。

fun getAlbums(): Task<Task<List<Album>>> {
return getGroupsSnapshot().continueWith { task ->
val documentSnapshots = TaskUtils.getResult(task)
val albums = mutableListOf<Album>()
val fetchAlbumTasks = documentSnapshots.documents.map { document ->
Log.d(TAG, document["name"].toString())
document.reference.collection("albums").get().addOnCompleteListener { queryTask ->
albums.addAll(toObjects(Album::class.java, queryTask))
}
}
return@continueWith Tasks.whenAll(fetchAlbumTasks).continueWith allTasks@ {
return@allTasks albums as List<Album>
}
}
}

但是我希望此操作返回类型 Task<List<Album>>保持界面清洁。

最佳答案

用于组合多个 Task你应该使用 continueWithTask而不是 continueWith .它接受 Continuation<TResult, Task<TContinuationResult>作为一个参数,它基本上使返回的 Task 变平并避免嵌套。您应该将其视为 map对比flatMap Monad 中的操作(即 List ),在本例中为 continueWithTask相当于 flatMap如果你使用 List作为容器而不是 Task (请记住,使用 flatMap 可以将 List 的每个元素转换为新的 List ,并将结果 List 展平)

关于android - 摆脱嵌套的任务类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53999351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com